Я разрабатываю приложение 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)
Должен ли я использовать его в views.py: form = IngredientForm (current_user = request.user) правильно? – Elisha512
правильный. Если у вас есть строка 'return render (request, 'create_ingredient.html', {'form': IngredientForm})' replace 'IngredientForm' с помощью экземпляра, который принял запрос.пользователь как аргумент – nkhumphreys
Спасибо @nkhumphreys, что он сработал, но есть одна проблема. Когда я отправляю форму, она дает ошибку в следующем сегменте: form = IngredientForm (request.POST) if form.is_valid(): .... Если вы можете решить эту ошибку, я буду отмечать ответ как правильный UPDATE: Ошибка, которую он мне дает, - это объект IngredientForm не вызываемый – Elisha512