首页 > 解决方案 > 在基于类的视图中自动填写表格

问题描述

我想在基于类的视图中自动填写一些表格并保存在数据库中。

在我看来发布功能

    def post(self, request, *args, **kwargs):
        form_2 = self.form_class_2(self.request.POST)
        if form_2.is_valid():
            keyword = form_2.cleaned_data['keyword']
            books = self.search(keyword)
            if books:
                for book in books:
                    title = self.add_title(book)
                    form = self.form_class(initial={"title": title})
                    if form.is_valid():
                        form.save()
                    else:
                        return HttpResponseRedirect(reverse_lazy('add_books'))

                return HttpResponseRedirect(reverse_lazy('import_books'))
            else:
                return HttpResponseRedirect(reverse_lazy('index_books'))

        return reverse_lazy('import_books')

我的表格

class BookForm(forms.ModelForm):

    class Meta:
        model = Book
        exclude = ()

我的表格_2

class SearchBookForm(forms.Form):
    keyword = forms.CharField(max_length=100)

我的模型

class Book(models.Model):
    title = models.CharField(
        max_length=75,
        verbose_name='Book title')
    published_date = models.CharField(
        max_length=10,
        validators=[check_if_value_is_date, max_year_validator],
        blank=True,
        null=True,
        verbose_name='Publishing date')
    pages = models.IntegerField(
        validators=[check_if_value_is_negative],
        blank=True,
        null=True,
        verbose_name='Number of pages')
    language = models.CharField(
        max_length=2,
        blank=True,
        null=True,
        verbose_name='Language')

这就是我的表单在验证之前的样子:

<tr><th><label for="id_title">Book title:</label></th><td><input type="text" name="title" value="Harry Potter i Kamień F
ilozoficzny" maxlength="75" required id="id_title"></td></tr>
<tr><th><label for="id_published_date">Publishing date:</label></th><td><input type="text" name="published_date" maxleng
th="10" id="id_published_date"></td></tr>
<tr><th><label for="id_pages">Number of pages:</label></th><td><input type="number" name="pages" id="id_pages"></td></tr
>
<tr><th><label for="id_language">Language:</label></th><td><input type="text" name="language" maxlength="2" id="id_langu
age"></td></tr>

基本上我有两种形式。表格 2 用于输入在我的搜索函数中用作参数的值。然后这个搜索函数返回.json,然后我从这个.json中获取一些值并分配给“title”然后这个title是我表单的初始数据。在验证之前一切正常。我的表单无效,但是当我在验证部分之前打印表单时,我看到我的初始数据符合预期。

标签: pythondjango

解决方案


默认情况下,Django 要求您填写表单中的字段。因此BookForm要求您在表格中填写标题、发布日期、页数和语言。form您在不传递实际输入的情况下进行实例化。是的,你传入了初始值,但你没有传入request.POST它(根据这里的内容)。所以你的表单实例化应该看起来像

form = self.form_class({'title': title, 'published_date': book.published_date, 'pages': book.pages, 'language': book.language})

推荐阅读