Как получить иностранный ключ в виджете формы как «выборы» в Django?(см. коды здесь) - PullRequest
0 голосов
/ 18 июня 2019

Есть два модуля.Первая книга, а другая категория.Есть форма и HTML-файл, которые предоставляют поля для ввода.

Я хочу изменить стиль полей в forms.py.Я знаю, как это сделать для текстовых полей, но когда я пытаюсь использовать раскрывающийся ввод (чужой ключ в другую таблицу), я получаю сообщение об ошибке при отправке формы.

в modules.py

class Category(models.Model):
    categoryname = models.CharField(max_length=100)

    def __str__(self):
        return self.categoryname

class Book(models.Model):
    title = models.CharField(max_length=100, default="-")
    category = models.ForeignKey(Category, on_delete=models.CASCADE,default="-")
    text = models.TextField(default="-")

    def __str__(self):
        return self.title

в forms.py

class CreateBook(forms.ModelForm):
    title = forms.CharField(widget=forms.TextInput(attrs={'class': 'text-form'}))

    def choice_list():
        choices = ()
        for choice in models.Category.objects.all():
            choices = choices + ((choice.id, choice),)
        return choices

    category = forms.ChoiceField(choices=choice_list(),
                               widget=forms.Select(attrs={'class': 'select-form'}))
    class Meta:
        model = models.Book
        fields = ['title', 'category', 'text']

в index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>New Book</title>
</head>
<body>

<form class="site-form" action="{% url 'Book:create' %}" method="post">
    {% csrf_token %}

       {{ form.title}}
        {{ form.category}}
        {{ form.text}}

    <input type="submit" value="Create">
</form>

</body>
</html>

Это ошибка, которую я получаю при отправке формы:

Cannot assign "'1'": "Book.category" must be a "Category" instance.

Подводя итог, как мне написать этот код ниже, чтобы получить иностранный ключ в ChoiceField?

What here??? choices=(???how address model here???),

Код:

 def choice_list():
            choices = ()
            for choice in models.Category.objects.all():
                choices = choices + ((choice.id, choice),)
            return choices

        category = forms.ChoiceField(choices=choice_list(),
                                   widget=forms.Select(attrs={'class': 'select-form'}))
...