最近帮人修改了个Django程序,做的过程,发现有些知识点还不是很熟练。
因此,做完了后做个总结整理,加强记忆,以后更快的写。
#1. 将模型添加至后台admin
其实有两种写法,但我更喜欢这种用@admin.register()
的方式,更显简洁:
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
...
admin
来自django.contrib
,但这个不用记,PyCharm里自动导入就行了。
#2. 在admin的模型list页面显示更多model的信息
默认,admin界面只显示model的verbose信息,如果想要更多信息,怎么办?
在PostAdmin
的list_display
定义要显示的fields。
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ("title", "slug", ...)
...
#3. 定义ModelForm的最小结构
至少要在Meta
class里定义model
和fields
两个变量
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'body')
...
#4. 修改ModelForm在template展开后的class属性
ModelForm
会用在template中用于呈现为表格。如果要和bootstrap结合,可以在ModelForm
里修改默认的表单属性。
通过如下方式,给每个field加上个form-control
的class属性
class PostForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
这样,在template通过form.as_p
展开后:
<form method="post" action=".">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
呈现出来的HTML为:
<form method="post" action="." >
...
<p>
<label for="id_title">标题:</label>
<input type="text" name="title" class="form-control" required id="id_title">
</p>
<p>
<label for="id_body">内容:</label>
<textarea name="body" cols="40" rows="10" class="form-control" id="id_body">
</textarea>
</p>
<button type="submit">提交</button>
</form>
#5. 修改Model在Django admin的展示名字
要在Model的定义里进行修改。
在Meta
class里定义verbose_name
和verbose_name_plural
两个变量。
对于中文来说,这两个没什么区别,中文无复数
class Post(models.Model):
...
class Meta:
verbose_name = "讨论帖"
verbose_name_plural = "讨论帖"
#6. Model三种DateTimeField的值
先上代码
class Post(models.Model):
...
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
-
publish
,保存时默认使用当前时间 -
created
,和publish
类似,在创建时自动使用当前时间 -
updated
,每次保存时都会使用保存时间更新
#7. slug中文
在Model定义时,通常会定义一个slug
。
class Post(models.Model):
...
slug = models.SlugField(editable=False)
但是,Django默认对中文的slug
不好,这时需要采用第三方的uuslug
,可通过pip安装:
pip install django-uuslug
然后在save()
的时候自动计算slug:
from uuslug import slugify
class Post(models.Model):
...
title = models.CharField(...)
slug = models.SlugField(editable=False)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
#8. 更好的views return写法
以前自己写return response
时总会把这句话写的很长
这次借鉴了网上一个人的写法,觉得很简洁,上代码:
def some_api(request):
...
template = "discuss.html"
context = {
"posts": posts
}
return render(request, template, context)
其实就是把template
,context
两个变量显示传递。
但比如下形式要看着舒服多了:
def some_api(request):
...
return render(request, "discuss.html", {
"posts": posts
})
#9. 新表单持久化的两种方式
因本文表单是通过ModelForm
定义的,和对应的Model已经建立了关联,因此可以直接进行保存。但保存时也有两个讲究。
一种是,没有需要传入的参数,比如Model没有ForeignKey
需要关联,这时候直接form.save
即可:
def some_api(request):
if request.method == "POST":
# 创建学生用户
form = SomeModelForm(request.POST)
if form.is_valid():
form.save()
return redirect("...")
另一种是需要额外传入ForeignKey
等其他参数,这时候需要form.save(commit=False)
,然后传入参数后再保存:
def some_api(request):
...
if request.method == "POST":
# 创建学生用户
form = SomeModelForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.author = request.user
instance.save()
return redirect("...")
#10. 更新表单持久化的方式
比如,要更新某个Post,区别于新表单的持久化,在获取form对象时,还需要传入待更新的对象,即:SomeModelForm(request.POST, instance)
示例如下:
def some_api(request):
post = get_object_or_404(...) # 获取post
if request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return redirect("...")
原文始发于微信公众号(Know Why It):Django拾遗
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/276223.html