#python #django
#python #django
Вопрос:
Создание карточного приложения. Пользователь может создать колоду и положить карты в эту колоду. Колоды и карты имеют поле «владелец» в своих моделях, чтобы указать, кто является пользователем.
forms.py
class CardForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
# Pop() removes 'user' from the kwargs dictionary and populates the user variable
user = kwargs.pop('owner')
super(CardForm, self).__init__(*args, **kwargs)
self.fields['deck'] = forms.ModelChoiceField( # modify choices on 'deck' field
queryset=Deck.objects.filter(owner=user)
)
class Meta:
model = Card
fields = ('term', 'definition', 'deck')
Часть, вызывающая ошибку ключа, является
super(CardForm, self).__init__(*args, **kwargs)
views.py
def card_new(request, deck):
if request.method == "POST":
form = CardForm(request.POST)
if form.is_valid():
card = form.save(commit=False)
card.save()
return redirect('card:detail', deck)
else:
form = CardForm(initial={'deck': deck}, owner=request.user) # this initial field sets card's deck as current deck
return render(request, 'card/card_edit.html', {'form': form})
models.py
class Card(models.Model):
owner = models.ForeignKey(User, null=True, default=True, related_name='oc')
term = models.CharField(max_length=100, default='N/A')
definition = models.TextField(default='N/A')
deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
Комментарии:
1. можете ли вы вставить точную трассировку ошибок?
2. Похоже, вам не хватает owner=request.user при первом вызове CardForm() в соответствии с условием request.method == «POST» .
Ответ №1:
Вы должны передать owner
для запросов POST, как вы уже делаете для запросов GET.
if request.method == "POST":
form = CardForm(request.POST, owner=request.user)