python - 将表单集保存在 UpdateView 中

标签 python django django-forms django-views django-generic-views

我有下面的具有多对多关系的模型EntryMeaning。我需要创建一个更新表单/ View 来同时编辑 EntryMeaning 对象。我还必须能够在编辑时向 Entry 对象添加更多 Meaning 对象。 我尝试使用 UpdateViewmodelformset_factory 如下。

我可以看到表单,但我的 View 没有保存含义更改。我有两个问题:

  1. 如何保存含义更改?

  2. 如何在此表单/ View 中添加或删除 Meaning 对象?

型号

class Entry(models.Model):
    title = models.CharField(max_length=70)
    slug = models.SlugField('slug', max_length=100, unique=True)

class Meaning(models.Model):
    title = models.CharField(max_length=70)
    language = models.CharField(max_length=5, choices=LANGUAGE_CHOICES)
    entry = models.ManyToManyField(
        Entry, related_name='meaning', 
        related_query_name='meanings',
        through='MeaningRelation')

class MeaningRelation(models.Model):
    entry = models.ForeignKey(Entry, on_delete=models.CASCADE)
    meaning = models.ForeignKey(Meaning, on_delete=models.CASCADE)

表格

class EntryForm(forms.ModelForm):
    class Meta:
        model = models.Entry
        fields = ['title', 'slug']

MeaningFormSet = modelformset_factory(models.Meaning, fields=('title', 'language'))

查看

class EntryUpdateView(UpdateView):
    model = models.Entry
    form_class = forms.EntryForm
    formset_class = forms.MeaningFormSet
    template_name = 'edit.html'

    def get_context_data(self, **kwargs):
        context = super(EntryUpdateView, self).get_context_data(**kwargs)
        qs = models.Meaning.objects.filter(entry=self.get_object())
        formset = forms.MeaningFormSet(queryset=qs)
        context['meaning_formset'] = formset
        return context

模板

# edit.html
<form action="" method="post">
    {% csrf_token %}
    {{ form.as_table }}

    {{ meaning_formset.management_form }}
    {% for meaning_form in meaning_formset %}
        {{ meaning_form.as_p }}
        <hr>
    {% endfor %}

    <input type="submit" value="Update"/>
</form>

最佳答案

我解决了将 post 方法添加到 EntryUpdateView 类中的问题:

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    qs = models.Meaning.objects.filter(entry=self.get_object())
    formsets = forms.MeaningFormSet(self.request.POST, queryset=qs)

    if form.is_valid():
        for fs in formsets:
            if fs.is_valid():
                fs.save()
        return self.form_valid(form)
    return self.form_invalid(form)

关于python - 将表单集保存在 UpdateView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841951/

相关文章:

javascript - $.get() 请求不适用于 Django

在模板上呈现时,Django 子表单不显示标签

python - 我们可以在 for 循环中使用分页符吗?

c++ - PyS60 与塞类 C++

python - 如何使用 python,BeautifulSoup 获取跨度值

python - Algolia reindex 命令在 urllib3 中失败并出现异常

python - 在 matplotlib 图中将鼠标限制在 Canvas 区域

django - 除了 super 用户,如何使字段在 django admin 中只读?

python - python的importlib可以在并发环境下工作吗?

ios - iOS 中的 Django 管理过滤器小部件