gpt4 book ai didi

django - 基于 get_initial() 的 CBV CreateView 限制 ForeignKey

转载 作者:行者123 更新时间:2023-12-04 17:01:12 25 4
gpt4 key购买 nike

我有两个应用程序,familyperson .在 Person类,我想限制可用 motherfather对已创建的相同对象的选择 family .如果我可以利用 family_pk我设置在 get_initial()person/views.py:PersonCreateview ,并使用该 family_pk限制 mother 的外键选择和 father这似乎是对逻辑进行分组的好方法。这可能吗?
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']])

最佳答案

这可能有点旧,但我通过以下答案找到了解决方案: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']])

关于django - 基于 get_initial() 的 CBV CreateView 限制 ForeignKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18626221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com