【问题标题】:Django Formset will not filter by user objectsDjango Formset 不会按用户对象过滤
【发布时间】:2014-09-01 00:25:29
【问题描述】:

无法弄清楚如何过滤表单集以仅显示登录用户的博客文章。表单可以很好地呈现,但是它允许任何用户将照片分配给任何博客文章,无论谁拥有该博客文章。如何过滤博客帖子的选项,使其仅供登录用户使用?


views.py

@login_required
def addimage(request):
    user = request.user
    blogposts = Blogpost.objects.filter(user=user)
    print blogposts
    imageformset = modelformset_factory(Image, AddImageForm,extra=1) 
    if request.method == "POST":
        formset = imageformset(request.POST, request.FILES)
        if formset.is_valid() :
            for form in formset.cleaned_data:
                    image = form['image']
                    title = form['title']
                    blogpost = form['blogpost']
                    description = form['description']
                    photo = Image(
                        title = title,
                        image= image,
                        blogpost=blogpost,
                        description=description,
                        )
                    photo.user = request.user
                    photo.save()

            messages.success(request, 'We did it. Pictures are on the interwebs!')
            return HttpResponseRedirect("/%s/%s/" % (user, blogpost.slug))


    else:
        formset = imageformset()

    return render_to_response('photos/add_photos.html', {
        'formset' : formset,
        'blogpost' : blogposts,
        },
        context_instance=RequestContext(request))

forms.py

from django import forms 
from .models import *

class AddImageForm(forms.ModelForm):
    class Meta:
        model   = Image
        fields = ('image', 'title', 'blogpost', 'description')

Add_photos.html

{% extends "base.html" %}
{% load static %}
{% block content %}
<div>
    <form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
    <div id="submit"><input id="submit-btn" type="submit" value="Save"></div>
        {{ formset.management_form }}
        {{ formset.as_p }}

       <input type="submit" value="Save">
    </form>
</div>
{% endblock %}

【问题讨论】:

    标签: python django formset


    【解决方案1】:

    看起来您的博文字段是 ForeignKey。默认情况下,这由 django.forms.ModelChoiceField 表示。这继承自 ChoiceField,其选择是一个模型 QuerySet。请参阅ModelChoiceField 的参考资料。

    所以你想为字段的查询集属性提供一个自定义查询集。这在一定程度上取决于您的表单是如何构建的。我发现在构造函数中最容易做到,但使用表单集工厂使这有点棘手。您可以在构建表单集后尝试此操作:

    formset = imageformset()
    for form in formset.forms:
        form.fields['blogpost'].queryset = Blogpost.objects.filter(user=user)
    

    我认为您还需要在代码的 request.method == 'POST' 分支中调用 formset.is_valid() 之前这样做。

    【讨论】:

    • 收到错误“AddImageFormFormSet object has no attribute 'fields'”有什么想法吗?
    • fields 位于 form 而非表单集上。你在迭代表格吗?您可能需要通过 form['fields'] 访问它。
    • 这对我有用:formset = UploadFormSet() for formset: form.fields['blogpost'].queryset = Blogpost.objects.filter(user=user)
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2010-11-04
    • 2021-07-08
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多