Python 创建一个使用来自2个不同模型的属性的表单

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=

我正在尝试创建一个表单,将来自两个不同位置的元素混合在一起。我认为最好的方法可能是在同一页上显示两个不同的表单,除非其他人能帮我将它们全部放到一个表单中

我认为使用两个表单没有问题,但我有点不确定如何继续(也许我不需要!)

我有两个有点关联的类:Person(用户)和Friend,它们共享PersonBenefits

模型如下所示:

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_工厂正是我想要的!