私はこの問題を数日間解決しようとしてきましたが、かなり必死になっています。私が試してみたがうまくいかなかったもののいくつかについては、コメントアウトされたコードスニペットを参照してください。
問題: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))
models.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 にアクセスするための解決策をいくつか試しましたが、うまくいきませんでした。
前進する方法はありますか?