2017-09-15 28 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

相關問題