Django, получить значение формы ChoiceField - PullRequest
1 голос
/ 10 марта 2020

У меня есть форма, которая содержит поле выбора элементов в моей базе данных. Мой вопрос: Как я могу получить выбранное значение моего choicheField?

forms.py

class list_data(forms.Form):
    message = forms.CharField(widget=forms.Textarea)

    def __init__(self, author, *args, **kwargs):
        super(list_data, self).__init__(*args, **kwargs)
        self.fields['List'] = forms.ChoiceField(
            choices=[(o.id, str(o)) for o in List.objects.filter(author=author)]
        )

views.py

def sms(request):
    form2  = list_data(author=request.user)

    if request.method == "POST":
        form2 = list_data(request.POST)
        if form2.is_valid():
            choice = form2.cleaned_data["List"]
            print(choice)

    else:
        return render(request, "data_list/sms.html", {"form2": form2})


    return render(request, "data_list/sms.html", {"form2": form2})

Когда я пытаюсь нажать Кнопка «Отправить» выдаёт мне эту ошибку:

 int() argument must be a string, a bytes-like object or a number, not 'QueryDict'

Итак, я изменил form2 = list_data(request.POST) на form2 = list_data(author=request.user) ошибка исчезла, но больше ничего не печатается.

Спасибо за помощь

models.py

class List(models.Model):
    item = models.CharField(max_length=100)
    content = models.TextField()
    site = models.CharField(max_length=11, choices=THE_SITE)
    content_list = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return self.item

1 Ответ

2 голосов
/ 10 марта 2020

В случае запроса POST вы передаете request.POST в качестве первого параметра и, следовательно, как author, а не как данные. Вы можете переписать представление так:

def sms(request):
    if request.method == 'POST':
        form2 = <b>list_data(request.user, data=request.POST)</b>
        if form2.is_valid():
            choice = form2.cleaned_data["List"]
            print(choice)
    else:
        form2  = list_data(author=request.user)
    return render(request, "data_list/sms.html", {"form2": form2})

Однако я бы посоветовал использовать ModelChoiceField [Django -doc] , что позволит удалить некоторые шаблон логики c, и тогда вы можете работать с объектами модели:

class ListDataForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea)
    list = <b>forms.ModelChoiceField(</b>queryset=List.objects.none()<b>)</b>

    def __init__(self, author, *args, **kwargs):
        super(list_data, self).__init__(*args, **kwargs)
        self.fields['list']<b>.queryset</b> = List.objects.filter(author=author)

Обратите внимание, что в соответствии с рекомендациями стиля PEP-0008 классы должны быть написано в PerlCase (т. е. ListDataForm, а не list_data), а атрибуты должны быть записаны в snake_case, поэтому list, а не List.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...