2011-04-07 14 views
7

django modellerinden veri alma. Kısacası, aşağıda (ben gitmek gibi işaretlemeyi uyduruyorum) gibi şeyler yapabilmek için, keyfi bir metin alanına, bir kullanıcı için istiyorum.bağlanma ve hayal meyal Semantik MediaWiki tarafından sağlanan böyle işlevsellik arıyorum kullanıcı tarafından girilen metin

* Merhaba, herkes, bizim topraklarda [[:: AfricanSwallow.count]] Afrikalı kırlangıçlar olduğunu unutmayın.

* O Harry Avrupa Swallow taşıdı [[:: EuropeanSwallow.get (name = "Harry"). Coconuts.count]] hindistancevizi geri onunla biliyor muydunuz?

özelliklerin bu tür ek olarak, ben satır içi otomatik tamamlayabilirsiniz istiyorum - Kullanıcı yazmayı başlar belki zaman.

Ben tüm bunları yapabilir, ama bunların bir kısmını veya tamamını yapılmış umuyorum. Bu durumda bir fikrin var mı? sadece certian talimatların yürütülmesine olanak sağlayacak bir derleyici oluşturmak için

+1

Kod yerleştirme tehlike algılandı. – Eduardo

+0

Evet, gerçekten dikkatle geçerli koduna ayrıştırmak için yeni bir sözdizimi icat sürece bunu yapmak istemiyoruz. Aksi halde kendinizi bir hack yapmaya hazırlıyorsunuz. –

+0

ben yoktu dilek tahmin bir sözdizimi 'icat'. – jMyles

cevap

0

En zarif bir çözüm olacaktır. http://en.wikibooks.org/wiki/Compiler_Construction

bir başka yolu() ancak uygulamanıza güvenlik sorunları bir sürü getiriyor gibi bu kaçınmalıdır exec kullanmak daha @ öğrenin. Her zaman ilk olarak dizeyi ayrıştırmayı deneyebilirsiniz (geçerli sözdizimi için) ancak yine de olası bir güvenlik açığı olacaktır.

1

Böyle bir şey mümkün ama evrensel (ORM sağlayan tam salt okunur erişimi) güvenli bir şekilde yapmak çok zor olacaktır yapım olduğunu düşünüyorum. Özel bir yöneticisi sınıfına açıkça işaretlenmiş yöntemlerin önceden tanımlanmış setine

Sınır eylemleri:

İşte bazı fikirler. Örneğin:

from django.db import models 

class MarkupAccessManager(models.Manager): 
    def count(self): 
     return super(MarkupAccessManager, self).count() 
    count.expose_to_markup = True 


class AfricanSwallow(models.Model): 
    objects = MarkupAccessManager() 

işaretlemenizdeki modellerine referansta için, django.contrib.contenttypes çerçevenin avantaj sağlayacak ve etiketleri aşağıdaki biçimi olabilir: app_label.model_name action veya app_label.model_name action arg1 arg2.

sen (dil onları sağlıyorsa) özel etiketler kullanabilirsiniz seçeneklerinden birini biçimlendirme dili bağlı olarak, Django şablon etiketleri veya düz normal ifadeler. Bir etiketin içeriğini aldıktan sonra, bu maddede belirtilen usule çıkışında ile değiştirin ele alınmıştır:

from django.contrib.contenttypes.models import ContentType 

def replace_tag(tag): 
    """ 
    'birds.africanswallow count' => birds.models.AfricanSwallow.objects.count() 

    """ 
    bits = tag.split() 
    model_ref = bits[0] 
    action = bits[1] 
    args = bits[2:] 
    try: 
     ct = ContentType.objects.get_by_natural_key(*model_ref.split('.')) 
    except ContentType.DoesNotExist: 
     return 'Invalid model reference.' 

    model = ct.model_class() 

    method = getattr(model._base_manager, action, None) 
    if not method or not method.expose_to_markup: 
     return 'Invalid action.' 

    return method(*args) 

otomatik tamamlama sağlamak için, bu satırlar boyunca bir şey mevcut tüm bir listesini oluşturmak için yardımcı olacaktır Seçenekler: Bu kodu sınamadım. Umarım bu biraz yardımcı olur.

İlgili konular