通过当前登录的用户过滤ModelForm中的选择字段 [英] Filter select field in ModelForm by currently logged in user

查看:68
本文介绍了通过当前登录的用户过滤ModelForm中的选择字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试显示一个表单(ModelForm),其中的 select 字段已被当前登录用户过滤。在这种情况下,选择字段包含类别列表。我只想显示属于当前登录用户的类别。类别字段是IngredienceCategory模型的外键。

I'm trying to display a form (ModelForm) with a select field filtered by currently logged in user. The select field in this case contains a list of categories. I want to display only the categories which "belong" to the currently logged in user. The category field is a foreign key to the IngredienceCategory model.

这是到目前为止我要提出的内容,但这给了我一个错误(意外的关键字查询集)。有什么想法我做错了吗?

Here is what I've come up with so far but it's giving me an error (unexpected keyword queryset). Any ideas what I'm doing wrong?

# models.py
class IngredienceCategory(models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
    verbose_name_plural = "Ingredience Categories"

    def __unicode__(self):
        return self.name


class Ingredience(models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, null=True, blank=True)
    category = models.ForeignKey(IngredienceCategory, null=True, blank=True)

    class Meta:
         verbose_name_plural = "Ingredients"

    def __unicode__(self):
        return self.name


class IngredienceForm(ModelForm):
    class Meta:
        model = Ingredience
        fields = ('name', 'category')


# views.py
def home(request):
    if request.user.is_authenticated():
        username = request.user.username
        email = request.user.email
        foods = Food.objects.filter(user=request.user).order_by('name')
        ingredients = Ingredience.objects.filter(user=request.user).order_by('name')
        ingrcat = IngredienceCategory.objects.filter(user=request.user)

        if request.method == 'POST':
            form = IngredienceForm(request.POST)
            if form.is_valid():
                # Create an instance of Ingredience without saving to the database
                ingredience = form.save(commit=False)
                ingredience.user = request.user
                ingredience.save()
        else:
            # How to display form with 'category' select list filtered by current user?
            form = IngredienceForm(queryset=IngredienceCategory.objects.filter(user=request.user))

        context = {}
        for i in ingredients:
            context[i.category.name.lower()] = context.get(i.category.name.lower(), []) + [i]

        context2 = {'username': username, 'email': email, 'foods': foods, 'ingrcat': ingrcat, 'form': form,}
        context = dict(context.items() + context2.items())
    else:
        context = {}

    return render_to_response('home.html', context, context_instance=RequestContext(request))


推荐答案

之所以这样,是因为ModelForm不使用queryset关键字。

That's happening because ModelForm does not take a queryset keyword.

您可以通过在视图上设置查询集来实现此目的:

You can probably achieve this by setting the queryset on the view:

form = IngredienceForm()
form.fields["category"].queryset = 
        IngredienceCategory.objects.filter(user=request.user)

请参阅相关问题此处

这篇关于通过当前登录的用户过滤ModelForm中的选择字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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