2013-08-28 110 views
3

我試圖製作一個窗體來編輯它的父模型中的ManyToMany字段的值。作爲一個例子,我有類似於這三個模型:Django Inline Formset通過ManyToMany編輯一個值

class Language(models.Model): 
    label = models.CharField() 


class Word(models.Model): 
    language = models.ForeignKey(Language) 
    word = models.CharField() 
    entries = models.ManyToManyField(Entries, null=True, blank=True) 


class Entries(models.Model): 
    entry = models.CharField() 

每種語言將有大約50個單詞。每個單詞將有一個或兩個條目。

我生成的表單集編輯條目這樣一個給定的語言:

class WordForm(forms.ModelForm): 
    class Meta: 
     model = Word 
     hidden = ('language',) 

PronounFormSet = inlineformset_factory(Language, Word, 
     can_delete=False, extra=0, form=WordForm) 

這給了我<select>這讓我添加/刪除一個條目Word.entries。不過,我想允許用戶編輯領域Entries.entry 直接(即場Entries.entry應該在CharField()。如何修改我的WordForm允許這樣做?

我知道有可能更好的方式來做到這一點(例如不同的數據庫模式),但我受到傳統實現的嚴格限制。

+0

你是什麼意思,完全是_directly_? –

+0

我希望窗體在CharField()中顯示條目模型的'entry'字段 – Puzzled79

+0

您想要編輯現有條目還是隻允許用戶添加新條目? –

回答

4

如果您希望條目是文本字段,您可以將自定義字段添加到ModelForm,並且請確保默認字段未通過明確標識顯示哪些字段顯示:

class WordForm(forms.ModelForm): 
    class Meta: 
     model = Word 
     hidden = ('language',) 
     fields = ('word',) 
    entries = forms.CharField() 

你的表單驗證邏輯應該是這樣的:

for form in formset: 
    obj = form.save(commit=False) 
    obj.language = # select the language here 
    obj.save() 

    entry = Entries.objects.get_or_create(entry=form.cleaned_fields['entries']) 
    obj.entries.add(entry) 
    obj.save() 

記住這個實現,你可以用這種形式(因爲當表單呈現的字符字段將永遠是空的),不能編輯字段。

相關問題