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))

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 にアクセスするための解決策をいくつか試しましたが、うまくいきませんでした。

前進する方法はありますか?

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 に答える