2016-08-14 7 views
0

私は食材を作成するためのフォームを持つdjangoアプリケーションを開発しています。フォームには、レシピを選択するためのドロップダウンが含まれています。ユーザーが原料を作ったとき、ドロップダウンには、同じユーザーが作成したレシピだけが表示されます。Djangoはリクエストユーザに基づいてデータを選択します。

#forms.py 
class IngredientForm(forms.ModelForm): 
    primal = forms.BooleanField() 
    class Meta: 
     model = Ingredient 
     fields = ('recipe_id', 'title', 'instructions', 'rules') 
#models.py 
class Recipe(models.Model): 
    user = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=500) 
    description = models.TextField(max_length=500) 
    rules = models.TextField(max_length=500,blank=True) 
    def __str__(self): 
      return self.title 
class Ingredient(models.Model): 
    user = models.ForeignKey('auth.User') 
    recipe_id = models.ForeignKey(Recipe, on_delete=models.CASCADE) 
    title = models.CharField(max_length=500) 
    instructions = models.CharField(max_length=500) 
    rules = models.TextField(max_length=500,blank=True) 
    primal = models.CharField(default='0',max_length=500,blank=True) 
    def __str__(self): 
      return self.title 

#views.py 

def create_ingredient(request): 
    if request.method == 'POST': 
      form = IngredientForm(request.POST) 
      if form.is_valid(): 
       current_user = request.user 
       data = form.cleaned_data 
       ingredient_data=Ingredient.objects.create(user=current_user, recipe_id=data['recipe_id'],title=data['title'], primal=data['primal'], instructions=data['instructions'], rules=data['rules']) 
       ingredient_data.save() 
       ingredient = Ingredient.objects.get(pk = ingredient_data.pk) 
       return redirect('ingredient_detail', pk=ingredient.pk) 
      else: 
       messages.error(request, "Error") 
    return render(request, 'create_ingredient.html', {'form': IngredientForm }) 

問題は今、ユーザーがレシピを選択しようとすると、サイトのすべてのユーザーが作成したレシピは「recipe_id」ドロップダウンに表示されていることである:

は、ここに私のコードです。彼は自分で作成されたレシピをドロップダウンでしか見ることができません。どのようにそれを行うにはどのようなアイデア? ANSWER FROM

UPDATE:

私はこれを使用する場合:この行のnon-keyword arg after keyword argform = IngredientForm(current_user=request.user, request.POST)

UPDATE#2:

... 
    if request.method == 'POST': 
      form = IngredientForm(current_user=request.user, request.POST) 
      if form.is_valid(): 
... 

を、それは私にこの構文エラーを与える

もしI使用:

... 
    if request.method == 'POST': 
      form = IngredientForm(request.POST,current_user=request.user) 
      if form.is_valid(): 
... 
私が使用している場合は __init__() got multiple values of argument 'current.user'

は、それは私にエラーを与えるの答えから最新のアップデートを実施した後

'QueryDict' object has no attribute 'id'

UPDATE#3:それは私にエラーを与える

... 
    if request.method == 'POST': 
      form = IngredientForm(request.POST) 
      if form.is_valid(): 
... 

。あなたがこれを行うことができ、モデルの形で

def create_ingredient(request): 
    form = IngredientForm(current_user=request.user) 

答えて

1

class IngredientForm(ModelForm): 
    primal = forms.BooleanField() 
    class Meta: 
     model = Ingredient 
     fields = ('recipe_id', 'title', 'instructions', 'rules') 

    def __init__(self, current_user, *args, **kwargs): 
     super(IngredientForm, self).__init__(*args, **kwargs) 
     self.fields['recipe_id'].queryset = self.fields['recipe_id'].queryset.filter(user=current_user.id) 

は、そのように

form = IngredientForm(current_user=request.user) 

EDITのような形をインスタンスには以下のコードで私にエラーname 'current_user' is not defined を与えます#1:

POSTリクエストフォームにユーザーを渡す:

if request.method == "POST": 
    form = IngredientForm(request.POST, current_user=request.user) 
    if form.is_valid(): 
     .... 

EDIT#2:

以下であるものに初期化declerationを変更してみてくださいとkwargsからからユーザーをポップ:

def __init__(self, *args, **kwargs): 
    current_user = kwargs.pop('current_user', None) 
    super(IngredientForm, self).__init__(*args, **kwargs) 
    if current_user: 
     self.fields['recipe_id'].queryset = self.fields['recipe_id'].queryset.filter(user=current_user.id) 

は、私は、これはあなたの問題を解決するかもしれないと思う、残りの部分を残します(フォームを作成する場所)上記の私の答えと同じコード

+0

私はそれをviews.py:form = IngredientForm(current_user = request.user)で使用する必要がありますか? – Elisha512

+0

が正しい。あなたが 'return render(request、 'create_ingredient.html'、{'form':IngredientForm})という行を持っていれば、' IngredientForm'をリクエストを受けたインスタンス化されたフォームに置き換えます。ユーザーは引数として – nkhumphreys

+0

ありがとう@nkhumphreysそれは働いたが、1つの問題がある。フォームを送信すると、次のセグメントにエラーが表示されます。form = IngredientForm(request.POST) if form.is_valid():....このエラーを解決できる場合は、正しい回答としてマークします。それが私に与えるエラーIngredientFormオブジェクトは呼び出し可能ではありません – Elisha512

関連する問題