python - 创建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 吗?
解决方案
你会希望你的视图是 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_by
或post_date
用户不应手动填写的参数很有用。添加这些以排除,以便它们不会显示在表单中。
之后您也可以在模板中手动添加表单字段,{{form|crispy}}
但我会避免这样做,因为它会在处理数据时创建更多工作。
如果您填写的表格与模型无关,您也可以使用 forms.Form:
class SupportTicket(forms.Form):
title = forms.CharField(label="Titlte", max_length=250, widget=forms.TextInput(...)
content = forms....
EG 在信息被直接传递给 GitLab 而不是在本地保存到模型中以供以后使用的情况下使用它。
推荐阅读
- haskell - 我如何证明会推断出这种类型?
- php - 如果返回值是混合的,使用什么类型的提示?
- highcharts - 官方网站上的 Highcharts 大型热图无法在 Chrome 上运行
- php - mysql删除查询条件
- r - 使用 RColorBrewer 将颜色居中在 0 附近
- python - 在使用 for 循环遍历列表时从 csv 文件中提取值
- android - (Xamarin - Android)从另一个类调用 Activity 类中的公共方法?
- php - 在datalist中显示数据Mysql
- python - 如何在我的 Fedora 发行版上安装 data.table
- c - C 头文件中的函数?