0

我已经尝试解决这个问题几天了,变得非常绝望。请参阅注释掉的代码片段,了解我尝试过但没有奏效的一些事情。

问题:如何将category字段中的值限制IngredientForm为仅属于当前登录用户的值?

在此处输入图像描述

视图.py

@login_required
def apphome(request):
    IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category'))

    # Attempt #1 (not working; error: 'IngredientFormFormSet' object has no attribute 'fields')
    # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.none())
    # ingrformset.fields['category'].queryset = Category.objects.filter(user=request.user)

    # Attempt #2 (doesn't work)
    # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.filter(category__user_id = request.user.id))

模型.py:

class Category(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, null=True, blank=True)       

class Ingredient(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, null=True, blank=True)
    category = models.ForeignKey(Category, null=True, blank=True)
    counter = models.IntegerField(default=0)

表格.py:

class IngredientForm(ModelForm):
    class Meta:
        model = Ingredient 
        fields = ('name', 'category')

更新:我已经取得了一些进展,但该解决方案目前是硬编码的并且不能真正使用:

我发现我可以category通过表单类控制表单字段,然后在视图中传递表单,如下所示:

#forms.py
class IngredientForm(ModelForm):
    category = forms.ModelChoiceField(queryset = Category.objects.filter(user_id = 1))

    class Meta:
        model = Ingredient 
        fields = ('name', 'category')

#views.py
IngrFormSet = modelformset_factory(Ingredient, form = IngredientForm, extra=1, fields=('name', 'category'))

以上产生了我需要的结果,但显然user是硬编码的。我需要它是动态的(即当前用户)。我尝试了一些解决方案来访问 forms.py 中的 request.user,但这些都不起作用。

任何想法如何前进?

4

2 回答 2

3

您不需要任何类型的自定义表单。您可以将category字段的查询集更改为:

IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category'))
IngrFormSet.form.base_fields['category'].queryset = Category.objects.filter(user__id=request.user.id)
于 2013-01-08T01:18:07.350 回答
0
Category.objects.filter(user=request.user)

返回表单中初始值的列表对象,这没什么意义。

试试吧

Category.objects.get(user=request.user)

或者

Category.objects.filter(user=request.user)[0]
于 2013-01-06T12:48:24.347 回答