首页 > 解决方案 > 创建django表单,CreateView还是forms.ModelForm哪个更方便

问题描述

我是 django 的初学者。我想创建一个能够具有标题、内容、图像/文件上传等的帖子表单。我对模型表单和 createview 的概念非常困惑。我试过这个:

博客/view.py:

class PostCreateView(LoginRequiredMixin, CreateView):

    model = Post
    fields = ['title', 'content', 'imagefile']
    success_url = '/blog/home/'
    # template_name = 'blog/post_form.html'

    def __init__(self, *args, **kwargs):
        super(PostCreateView, self).__init__(**kwargs) # Call to ModelForm constructor

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.save()
        return super().form_valid(form)

博客/模板/博客/post_form.html:

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Post::</legend>
                {{ form|crispy }}
                <img src='{{ post.imagefile.url }}'>
                <br><br>
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Update</button>
            </div>
        </form>
    </div>
{% endblock content %}

博客/urls.py:

from django.urls import path
from .views import (
    PostCreateView,
)
urlpatterns = [
        path('blog/post/new/', PostCreateView.as_view(), name='post-create')
]

博客/models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    # image = models.ImageField(default='default_post.jpg', upload_to='postimages')
    imagefile = models.FileField(upload_to='postimages', null=True, verbose_name="")


    # if user is deleted the idea should be deleted as
    author = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
    # return self.title
    return self.title + ": " + str(self.imagefile)

def get_absolute_url(self):
    return reverse('post-detail', kwargs={'pk': self.pk})

我的问题:我想要的只是制作一种表格来创建带有标题内容上传按钮提交按钮的新帖子。但是我不知道是否可以自定义CreateView甚至添加更多项目或表单。应该使用 Modelforms 吗?

标签: pythondjangodjango-modelscreate-view

解决方案


你会希望你的视图是 inviews.py并且你的表单是 in forms.py。您将需要两者,而不是其中之一。

就像是:

class CreateXYZView(CreateView):
    template_name = "blog/post_form.html"
     model = Post
     form_class = postform



...do view stuff
    def post(self, request, *args, **kwargs):

还有一个 forms.py 文件

class postform(forms.ModelForm):
   class Meta:
       model = Post
       widgets = {}
       exclude = ['fieldname']

看起来您正在使用一个名为 Post 的模型,这是一个好主意。通过声明postform为 a forms.ModelForm,它将把你的模型字段从 Post 类中拉入表单 IE 中,它会拉取标题、内容、图像字段等。除非该字段专门添加到 exclude 参数中。这对于模型中的参数(例如自动字段)created_bypost_date用户不应手动填写的参数很有用。添加这些以排除,以便它们不会显示在表单中。

之后您也可以在模板中手动添加表单字段,{{form|crispy}}但我会避免这样做,因为它会在处理数据时创建更多工作。

如果您填写的表格与模型无关,您也可以使用 forms.Form:

class SupportTicket(forms.Form):
    title = forms.CharField(label="Titlte", max_length=250, widget=forms.TextInput(...)
    content = forms....

EG 在信息被直接传递给 GitLab 而不是在本地保存到模型中以供以后使用的情况下使用它。


推荐阅读