python - Django Formset 不会按用户对象进行过滤

标签 python django formset

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

<小时/>

View .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))
<小时/>

表单.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 %}

最佳答案

看起来您的 blogpost 字段是一个外键。默认情况下,它由 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() 之前执行此操作。

关于python - Django Formset 不会按用户对象进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597497/

相关文章:

python - IPython 笔记本中的 Pyzmq 错误

python - 如何使用多行条件从 Pandas 数据框中选择列

django - celery 关闭

python - 将 APITestCase 与 django-rest-framework 一起使用

python - 如何保存 Django ModelFormSet?

python - PySpark应用程序在纱簇模式和独立模式下提交错误

python - 在 python 中将图像转换为字符串后存档图像

python - 找不到记录器 "elasticsearch.trace"的处理程序

python - modelformset_factory 和 csrf token 丢失或不正确

python - 通用 FormView 中的 Django Formset