5

पर आधारित विदेशीकी सीमा मेरे पास दो ऐप्स हैं, family और personPerson कक्षा में, मैं उपलब्ध और father विकल्पों को उन वस्तुओं तक सीमित करना चाहता हूं जो पहले से ही उसी family से बनाए गए हैं। अगर मैं family_pk का उपयोग कर सकता हूं तो person/views.py:PersonCreateview में get_initial() में सेट किया गया है, और family_pk का उपयोग mother और father के विदेशीके विकल्पों को प्रतिबंधित करने के लिए करें, ऐसा लगता है कि यह तर्क तर्क समूह का एक शानदार तरीका हो सकता है। क्या यह संभव है?सीबीवी CreateView सीमा 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']]) 

उत्तर

10

यह शायद थोड़ा पुराना है, लेकिन मैं इस जवाब के माध्यम से एक समाधान पाया: https://stackoverflow.com/a/291968/1971587

तरह से मैं कर रही यह काम get_form के साथ था वास्तव में समाप्त हो गया()। तो अपने मामले में मेरा मानना ​​है कि कुछ इस तरह काम करेगा:

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 विश्वास नहीं है() अभी भी यहाँ आवश्यक होगा, लेकिन यह अन्य टुकड़े के लिए अपने मामले में आवश्यक हो सकता है। –

संबंधित मुद्दे