2017-09-15 62 views
0

我正在尝试创建一个表单,用于混合来自几个不同位置的元素。我认为做这件事的最好方法可能是两种不同的形式,并将它们显示在同一页面上,除非其他人可以帮助我将其全部集成到一个表单中?创建使用来自2个不同模型的属性的表单

我看到没有问题,使用2种形式,但我有点不确定如何进行(也许我不需要!)。

我有两个有点相关的类:人(用户)和朋友,他们共享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

再次,在阅读之后,我想有两种独立的形式可能是最好的方式去,但我不知道如果也许我只是在我的forms.py中做一些愚蠢的东西,它可以只用1个表单。

这主要是:

对于每一个“朋友”,显示了与朋友的名字和文本字段的复选框有点形式紧随其后(相当于其ben_id_num

回答

1

这听起来就像你正在寻找的是一个Django Formset,它可以让你在同一个表单编辑模型与一个或多个相关的模型。

我已经使用django-extra-views提供的CreateWithInlinesViewUpdateWithInlinesView,使表单集一一些成功利特更容易管理。

如果形式确实需要大量的定制逻辑的,并没有什么东西将所有这些字段的自定义窗体,然后在FormViewform_valid(self, form)方法编写自定义逻辑阻止你。

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

+0

我正在阅读formset上的文档 - 我认为这可能正是医生订购的内容。现在试着看看我能想出什么!如果它有效,这将是一种享受! – Hanny

+0

@Hanny Formsets采取了一些练习,但一旦习惯了他们,他们真的很方便。祝你好运! – Franey

+0

这工作得很好。实际上,我发现modelformset_factory就是我正在寻找的东西! – Hanny

相关问题