我已经尝试解决这个问题几天了,变得非常绝望。请参阅注释掉的代码片段,了解我尝试过但没有奏效的一些事情。
问题:如何将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,但这些都不起作用。
任何想法如何前进?