【问题标题】:Django Formset Issue On Select Field and Saving?选择字段和保存时的 Django Formset 问题?
【发布时间】:2013-08-12 13:08:56
【问题描述】:

我想使用表单集来编辑模型“类别”中的所有记录。我想知道如何解决两个问题:

  1. 目前它使用初始数据填充所有字段,除了输入 选择“语言”并输入选择“父母”。
  2. 提交时不保存。

models.py

class Category(models.Model):
    ORDER = (
    ('1', '1'),
    ('2', '2'),
    ('3', '3'))
    id = models.AutoField(primary_key=True)
    language = models.ForeignKey(Language, null=False, blank=False)
    name = models.CharField(max_length=256, null=False, blank=False)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    slug = models.SlugField(unique=True, blank=False, null=False)
    order = models.SmallIntegerField(null=True, blank=True, choices=ORDER)
    allow_replies = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now=True)

# Forms
class CategoryForm(ModelForm):
    class Meta:
        model = Category
        fields = ['language', 'name', 'parent', 'allow_replies', 'order']

views.py

def category_formset(request):
    if is_admin_user(request):
        CategoryFormSet = formset_factory(CategoryForm)
        if request.method == 'POST':
            formset = CategoryFormSet(request.POST)
            if formset.is_valid():
                formset.save()
        else:
            formset = CategoryFormSet(initial=Category.objects.values())
        return render_to_response("pages/category_formset.html",
                                  {"formset": formset, 'is_logged_in': is_logged_in(request)},
                                  context_instance=RequestContext(request))
    else:
        return redirect('/', False)

html 模板

<form action="/category/edit/" method="post">
    {% csrf_token %}
    <table>
        <tr>
            <td>Language</td>
            <td>Name</td>
            <td>Parent</td>
            <td>Allow Replies</td>
            <td>Order</td>
        </tr>
        {% for form in formset %}
        <tr>
            {% for item in form %}
                <td>{{ item }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </table>

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

提前致谢。

【问题讨论】:

  • 小技巧:使用modelfomset_factory

标签: python django django-forms formset


【解决方案1】:

解决方案

型号

# ...
def category_formset(request):
    if is_admin_user(request):
        CategoryFormSet = modelformset_factory(Category, exclude="slug", extra=0)

        if request.POST:
            formset = CategoryFormSet(request.POST)
            if formset.is_valid():
                formset.save()
                return redirect('/categories/')
        else:
            formset = CategoryFormSet(initial=Category.objects.values())
        return render_to_response("pages/category_formset.html",
                                  {"formset": formset, 'is_logged_in': is_logged_in(request)},
                                  context_instance=RequestContext(request))
    else:
        return redirect('/', False)

模板

<form action="/category/edit/" method="post"  enctype="multipart/form-data">
    {% csrf_token %}
    {{ formset.management_form }}
    {{ formset.errors }}
    <table>
        <tr>
            <td>Language</td>
            <td>Name</td>
            <td>Parent</td>
            <td>Allow Replies</td>
            <td>Order</td>
        </tr>
        {% for form in formset %}
        <tr>
            {% for item in form %}
                <td>{{ item }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </table>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 2023-04-02
    • 2015-02-11
    • 2017-05-04
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多