재료를 만드는 형식이있는 장고 애플리케이션을 개발 중입니다. 양식에는 레시피 선택을위한 드롭 다운이 포함되어 있습니다. 사용자가 재료를 만들 때 드롭 다운에 동일한 사용자가 만든 레시피 만 나타나기를 원합니다.
내 코드는 다음과 같습니다.
#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)
업데이트 # 2 :
내가 사용하는 경우 :
...
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'
업데이트 # 3 :
답변에서 최신 업데이트를 구현 한 후. name 'current_user' is not defined
다음 코드에서 오류가 발생 합니다.
def create_ingredient(request):
form = IngredientForm(current_user=request.user)
모델 양식에서 다음을 수행 할 수 있습니다.
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)
# 1 수정 :
사용자를 POST 요청 양식에 전달 :
if request.method == "POST":
form = IngredientForm(request.POST, current_user=request.user)
if form.is_valid():
....
편집 # 2 :
init 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)
이것이 문제를 해결할 수 있다고 생각하고 나머지 코드는 위의 답변과 동일하게 남겨 둡니다 (양식을 만드는 곳)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다