5

tabanlı iki uygulama var, family ve person. Person sınıfında, mevcut mother ve father seçimlerini aynı family zaten oluşturulmuş olan nesnelerle sınırlamak istiyorum. family_pk'dan yararlanabilirsem person/views.py:PersonCreateview'da get_initial()'da ayarlıyorum ve mother ve father ForeignKey seçeneklerini kısıtlamak için family_pk kullanın ve bu da mantığı gruplamak için harika bir yol olabilir. Mümkün mü?CBV Oluşturma sınırı yabancı get_initial()

family/models.py

class Family(models.Model): 
    lastname=models.CharField(max_length=100) 

    def __str__(self): 
     return self.lastname 

family.views.py

from django.views import generic 
from django.core.urlresolvers import reverse 

from .models import Family 

class FamilyListView(generic.ListView): 
    context_object_name='family_list' 
    model=Family 


class FamilyDetailView(generic.DetailView): 
    context_object_name='family' 
    model=Family 
    pk_url_kwarg='family_pk' 


class FamilyCreateView(generic.CreateView): 
    model=Family 

    def get_success_url(self,**kwargs): 
     return reverse('family-detail',kwargs={'family_pk':self.object.pk}) 

person/models.py

class Person(models.Model): 
    fields=('family','firstname','mother','father') 
    family=models.ForeignKey(Family) 
    firstname=models.CharField(max_length=100) 
    mother=models.ForeignKey('self',blank=True,null=True) 
    father=models.ForeignKey('self',blank=True,null=True) 

    def __str__(self): 
     return self.firstname 

person/views.py

from django.views import generic 
from django.core.urlresolvers import reverse 
from django.shortcuts import get_object_or_404 

from .models import Person 
from family.models import Family 

class PersonDetailView(generic.DetailView): 
    model=Person 
    pk_url_kwarg='person_pk' 

class PersonCreateView(generic.CreateView): 
    model=Person 

    def get_initial(self): 
     family=get_object_or_404(Family,pk=self.kwargs.get('family_pk')) 
     return {'family':family,} 

    def get_success_url(self,**kwargs): 
     return reverse('family:family-detail',args=[self.kwargs['family_pk']]) 

cevap

10

Bu belki biraz eski, ama bu cevap yoluyla bir çözüm buldum: Ben iş get_form ile aslında yapım sona erdi https://stackoverflow.com/a/291968/1971587

yolu(). Bu durumda sizin gibi bir şeye ineceğime inanıyorum:

class PersonCreateView(generic.CreateView): 
    model = Person 

    def get_family(self): 
     return get_object_or_404(Family, pk=self.kwargs.get('family_pk')) 

    def get_form(self, form_class): 
     form = super(generic.CreateView, self).get_form(form_class) 
     family = self.get_family() 
     form.fields['mother'].queryset = Person.objects.filter(family) 
     form.fields['father'].queryset = Person.objects.filter(family) 
     return form 

    def get_initial(self): 
     initial = super(generic.CreateView, self).get_initial() 
     initial['family'] = self.get_family() 
     return initial 

    def get_success_url(self, **kwargs): 
     return reverse('family:family-detail', args=[self.kwargs['family_pk']]) 
+1

get_initial() 'ın hala burada gerekli olacağını sanmıyorum, fakat diğer parçalar için sizin durumunuzda gerekli olabilir. –