创建一个使用来自2个不同模型

时间:2017-09-15 14:59:59

标签: python django django-models django-forms

我试图创建一个混合来自不同地方的元素的表单。我认为最好的方法可能是两种不同的形式,并在同一页面上显示,除非其他人可以帮我把它全部弹出一个表格?

我认为使用2种形式没有问题,但我有点不确定如何继续(也许我不需要!)。

我有2个有些相关的课程:Person(User)和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)

forms.py看起来像这样:

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_id_num

再次,在阅读之后,我认为拥有2个单独的表格可能是最好的方式,但我不确定我是否只是在我的表格中做了一些愚蠢的事情。 py原样,只能使用1种形式。

这基本上是:

对于每位朋友',显示一个小表单,其中包含一个带有好友名称的复选框以及紧随其后的文本字段(对应于他们的ben_id_num

1 个答案:

答案 0 :(得分:1)

听起来你正在寻找的是Django Formset,它允许你用同一形式的一个或多个相关模型编辑模型。

我使用django-extra-views提供的UpdateWithInlinesViewFormView取得了一些成功,使形式集更容易管理。

如果表单确实需要大量自定义逻辑,那么就没有什么能阻止您将所有这些字段添加到自定义表单,然后在form_valid(self, form) {{{1}} {{ {1}}方法。

关于Django的好处是你可以尽可能使用它的助手类,但如果你需要更自定义的解决方案,你总是可以手动处理。