将表单集保存在UpdateView中 [英] Save formset in an UpdateView

查看:65
本文介绍了将表单集保存在UpdateView中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我下面具有多对多关系的模型 Entry Meaning .我需要创建一个更新表单/视图,以同时编辑 Entry Meaning 对象.我还必须能够在编辑它的同时向 Entry 对象添加更多的 Meaning 对象.我尝试如下使用 UpdateView modelformset_factory .

I have the models Entry and Meaning below with many-to-many relation. I need to create an update form/view to edit Entry and Meaning objects at the same time. I have also to be able to add more Meaning objects to an Entry object while editing it. I tried to use UpdateView and modelformset_factory as below.

我可以看到表格,但是我的视图没有保存含义的更改.我有两个问题:

I can see the forms, but my view doesn't save the Meaning changes. I have two questions:

  1. 如何保存含义更改?

如何在此表单/视图中添加或删除含义对象?

How do I add or delete a Meaning object in this form/view?

模型

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>

推荐答案

我解决了向 EntryUpdateView 类添加 post 方法的问题:

I solved the problem adding the post method to EntryUpdateView class:

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)

这篇关于将表单集保存在UpdateView中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆