2016-08-14 3 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» выпадающего меню. Он должен видеть только рецепты в раскрывающемся списке, которые создаются самим. Есть идеи, как это сделать?

ОБНОВЛЕНИЕ ОТ ОТВЕТА:

Если я использую это:

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

это дает мне эту ошибку синтаксиса: non-keyword arg after keyword arg в этой строке form = IngredientForm(current_user=request.user, request.POST)

UPDATE # 2:

If 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'

Если я использую:

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

Это дает мне ошибку: 'QueryDict' object has no attribute 'id'

UPDATE # 3:

После реализации последнего обновления от ответа. Это дает мне ошибку name 'current_user' is not defined в следующем фрагменте кода:

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 № 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})' replace 'IngredientForm' с помощью экземпляра, который принял запрос.пользователь как аргумент – nkhumphreys

+0

Спасибо @nkhumphreys, что он сработал, но есть одна проблема. Когда я отправляю форму, она дает ошибку в следующем сегменте: form = IngredientForm (request.POST) if form.is_valid(): .... Если вы можете решить эту ошибку, я буду отмечать ответ как правильный UPDATE: Ошибка, которую он мне дает, - это объект IngredientForm не вызываемый – Elisha512