Python 创建一个使用来自2个不同模型的属性的表单
我正在尝试创建一个表单,将来自两个不同位置的元素混合在一起。我认为最好的方法可能是在同一页上显示两个不同的表单,除非其他人能帮我将它们全部放到一个表单中 我认为使用两个表单没有问题,但我有点不确定如何继续(也许我不需要!) 我有两个有点关联的类:Person(用户)和Friend,它们共享PersonBenefits 模型如下所示:Python 创建一个使用来自2个不同模型的属性的表单,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我正在尝试创建一个表单,将来自两个不同位置的元素混合在一起。我认为最好的方法可能是在同一页上显示两个不同的表单,除非其他人能帮我将它们全部放到一个表单中 我认为使用两个表单没有问题,但我有点不确定如何继续(也许我不需要!) 我有两个有点关联的类:Person(用户)和Friend,它们共享PersonBenefits 模型如下所示: class PersonBenefit(models.Model): benefit = models.ForeignKey(Benefit, null=
class PersonBenefit(models.Model):
benefit = models.ForeignKey(Benefit, null=True)
user = models.ForeignKey(User)
class Friend(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
has_benefit = models.BooleanField(default=False)
ben_id_num = models.CharField(max_length=10, blank=True, null=True)
person = models.ForeignKey(User)
#good, better, best
class BenefitType(models.Model):
name = models.CharField(max_length=25)
def __str__(self):
return self.name
class Benefit(models.Model):
type = models.ForeignKey(BenefitType)
name = models.CharField(max_length=25)
class GoodBenefitForm(forms.Form):
benefit = forms.ModelChoiceField(
queryset=Benefit.objects.filter(type__name='Good'),
widget = forms.Select(attrs={'class':'g-1-3'})
)
# THIS SHOWS A LIST OF ALL THE FRIENDS FOR THIS USER - DISPLAYS THEIR NAMES NICELY WITH CHECKBOXES
friend = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
# I WANT THIS TO BE A BUNCH OF TEXTBOXES INSTEAD OF CHECKBOXES - ONE FOR EACH FRIEND FOR THE USER
friend_group_id = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
queryset = Friend.objects.filter(person=self.user)
super(FriendBenefitForm, self).__init__(*args, **kwargs)
self.fields['friend'].queryset = queryset
self.fields['friend_group_id'].queryset = queryset
forms.py如下所示:
class PersonBenefit(models.Model):
benefit = models.ForeignKey(Benefit, null=True)
user = models.ForeignKey(User)
class Friend(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
has_benefit = models.BooleanField(default=False)
ben_id_num = models.CharField(max_length=10, blank=True, null=True)
person = models.ForeignKey(User)
#good, better, best
class BenefitType(models.Model):
name = models.CharField(max_length=25)
def __str__(self):
return self.name
class Benefit(models.Model):
type = models.ForeignKey(BenefitType)
name = models.CharField(max_length=25)
class GoodBenefitForm(forms.Form):
benefit = forms.ModelChoiceField(
queryset=Benefit.objects.filter(type__name='Good'),
widget = forms.Select(attrs={'class':'g-1-3'})
)
# THIS SHOWS A LIST OF ALL THE FRIENDS FOR THIS USER - DISPLAYS THEIR NAMES NICELY WITH CHECKBOXES
friend = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
# I WANT THIS TO BE A BUNCH OF TEXTBOXES INSTEAD OF CHECKBOXES - ONE FOR EACH FRIEND FOR THE USER
friend_group_id = forms.ModelMultipleChoiceField(
queryset = Friend.objects.none(),
widget = forms.CheckboxSelectMultiple(),
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
queryset = Friend.objects.filter(person=self.user)
super(FriendBenefitForm, self).__init__(*args, **kwargs)
self.fields['friend'].queryset = queryset
self.fields['friend_group_id'].queryset = queryset
本质上,我试图让表单显示一个带有复选框的“朋友”列表,然后在他们的名字旁边显示一个文本字段,用户可以输入ben\u id\u num
同样,在阅读之后,我认为拥有两个单独的表单可能是最好的方式,但我不确定我是否只是在表单中做了一些愚蠢的事情。py as is,它可以只使用一个表单
这基本上是:
对于每个“朋友”,显示一个小表单,该表单有一个复选框,复选框后面紧跟着朋友的姓名和一个文本字段(对应于他们的
ben\u id\u num
听起来像是您要找的是一个,它允许您编辑一个模型,其中包含一个或多个相同表单中的相关模型
我已经成功地使用了提供的CreateWithInlinesView
和UpdateWithInlinesView
使表单集更易于管理
如果表单确实需要大量自定义逻辑,那么没有什么可以阻止您将所有这些字段添加到自定义表单中,然后在FormView
的form\u valid(self,form)
方法中编写自定义逻辑
Django的好处在于,您可以在可以的时候使用它的帮助器类,但是如果您需要更定制的解决方案,您可以随时手动处理事情。我现在正在阅读formset上的文档,我想这可能正是医生所要求的。现在尝试一下,看看我能想出什么!如果它有效,这将是一种治疗!@Hanny Formsets需要一点练习,但一旦你习惯了它们,它们真的很方便。祝你好运!这很有效。我发现modelformset_工厂正是我想要的!