Django Inline Formset通过ManyToMany编辑一个值

时间:2013-08-28 22:55:27

标签: django forms

我正在尝试创建一个表单来编辑其父模型中的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个单词。每个Word每个都有一个或两个条目。

我正在生成formset来编辑给定语言的条目,如下所示:

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以允许这个?

我知道可能有更好的方法(例如,不同的数据库架构),但我受到传统实现的严重限制。

1 个答案:

答案 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()

请记住此实现,您无法使用此表单编辑字段(因为在呈现表单时字符字段将始终为空)。