Django拾遗

Django拾遗

最近帮人修改了个Django程序,做的过程,发现有些知识点还不是很熟练。

因此,做完了后做个总结整理,加强记忆,以后更快的写。

#1. 将模型添加至后台admin

其实有两种写法,但我更喜欢这种用@admin.register()的方式,更显简洁:

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    ...

admin来自django.contrib,但这个不用记,PyCharm里自动导入就行了。

#2. 在admin的模型list页面显示更多model的信息

默认,admin界面只显示model的verbose信息,如果想要更多信息,怎么办?

PostAdminlist_display定义要显示的fields。

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ("title""slug", ...)
    ...
#3. 定义ModelForm的最小结构

至少要在Metaclass里定义modelfields两个变量

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的定义里进行修改。

Metaclass里定义verbose_nameverbose_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)


其实就是把templatecontext两个变量显示传递。

但比如下形式要看着舒服多了:

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

(0)
python学霸的头像python学霸bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!