2011-06-25 23 views
7

Aynı temel sınıftan miras alınan bir dizi model için formları işlemek için genel CreateView sınıfı kullanmaya çalışıyorum. KURU şeyleri tutmak için Django: parametrik sınıf tabanlı görünümler

class BaseContent(models.Model): 
    ... 

class XContent(BaseContent): 
    ... 

class YContent(BaseContent): 
    ... 

, ben BaseContent tüm kalıtsal sınıfları idare edecek bir CreateView sınıfını tanımlamak istiyorum.

o görünüm için url kalıptır:

class ContentCreateView(CreateView): 
    template_name = 'content_form.html' 

    def get_model(self, request): 
     # 'content' is the name of the application; model_name is 'xcontent', 'ycontent', ... 
     return ContentType.objects.get_by_natural_key('content', self.model_name) 

Ama bu istisna alıyorum: Böyle

url(r'^content/add/(?P<model_name>\w+)/$', ContentCreateView.as_view(), name='content_add') 

şey çalışmalıdır

ContentCreateView is missing a queryset. Define ContentCreateView.model, ContentCreateView.queryset, or override ContentCreateView.get_object(). 

Bu öneri yok model veya queryset t gibi bir sınıf özniteliği ayarlamak istemediğimden o modelin oluşturduğu formu dinamik tutun. get_object'u geçersiz kılmak bir nesne oluşturmakla alakalı görünmüyor.

get_queryset()'u geçersiz kılmayı denedim, ancak bu yöntem request parametresini kabul etmiyor ve URL modelinden gelen self.model_name erişimini de içermiyor.

Uzun lafın kısası, bir CreateView url'den alınan bir parametreye dayalı olarak dinamik bir form nasıl kullanabilirim?

Teşekkürler.

+0

ben bu isteği düşünmek ve kendini olabilir böylece MODEL_NAME, örnek değişkenler olarak ayarlanmış: Böyle gönderme as_view (tanımlanan yöntem) (django.views.generic.base), bir şey geçersiz kılmak gerekir .Request ve self.model_name get_queryset() yönteminin içinde. Bu düşünceyi denemedim. – bmihelac

+1

Evet, CreateView öğesinin ataları olan görünüm sınıfı, kwargs'i url'den örnek değişkenleri olarak ayarlar. ama 'self.model_name', 'self.request 'iken başka bir karışımdan geldiği için get_queryset()' için erişilemez. Eğer model ismini 'get' parametresi olarak geçersem, istediğimi yapabilirim ama güzel olmaz. imo, kalıtımın ve karıĢımların sınıf temelli görünümlerde ve dokümantasyon eksikliğinde nasıl organize edildiğini, sınıf yöntemlerini ve özniteliklerini izlemesi çok zor hale getirir. – omat

+1

Her model için form sınıfları oluşturabilir ve istek modellerini temel alan görünüm için ilgili formu almak için 'ModelFormMixin' türündeki get_form_class yöntemine binemez misiniz? Son çare olarak – vimukthi

cevap

1

Sen çağrılan url bağlı senin senin urls.py den model niteliğini ayarlayabilirsiniz:

url(r'^content/add/x/$', 
    ContentCreateView.as_view(model=XContent), name='x_content_add'), 
url(r'^content/add/y/$', 
    ContentCreateView.as_view(model=YContent), name='y_content_add') 

Ben kendinizi biraz tekrarlayan gibi değil mükemmel olduğunu kabul ediyorum ama bu nedenle sahip olma avantajına sahip Modele bağlı olarak aynı görünüm için farklı isimler! Bunun yanı sıra, form_class ...

+0

as_view() argümanları kabul etmiyor gibi görünüyor. Önerdiğiniz gibi: 'as_view() tam olarak 1 argüman alır (2 verilen). url şablonunu şu şekilde değiştirdim: url (r '^ ekle/x/$', ContentCreateView.as_view(), {'queryset': XContent.objects.all()}) 'ama kwarg sınıf örneğine aktarılmamış gibi görünüyor:' ContentCreateView bir queryset' eksik. – omat

+0

Özür dilerim benim hatam, tabiki kwargs olarak vermek zorundasın, dict olarak değil, cevabı düzenledin! –

+0

Güncelleme için teşekkürler, şimdi iyi. Çok yakında birden çok kalıtım düzeyiyle kolay olmamasına rağmen, yakında belgeleneceğine inanıyorum. – omat

1

Bu sorunu çözmek için benzer bir şey yapabildiniz, ancak bir çözüm buldum.

class ContentCreateView(CreateView):  
    def dispatch(self, request, *args, **kwargs): 
     for app in ['foo', 'bar']: 
      model = models.get_model(app, kwargs['modelname']) 
      if model: 
       self.model = model 
       break 

     return super(GenericEdit, self).dispatch(request, *args, **kwargs) 
    ... 
    ... 
İlgili konular