首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改listview Django中的字段格式

修改listview Django中的字段格式
EN

Stack Overflow用户
提问于 2020-03-08 02:23:12
回答 2查看 220关注 0票数 0

有没有什么好方法可以修改列表视图中的各个数据字段?例如,我有一个博客文章模型,它看起来像

代码语言:javascript
运行
复制
class Blog(models.Model):
    create_time = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=250)
    document = models.TextField(blank=True)

我的列表视图如下所示:

代码语言:javascript
运行
复制
class BlogPostListView(ListView):
    model = Blog
    template_name = 'blog/posts.html'
    context_object_name = 'posts'
    ordering = ['-create_time']

显然,我希望以表格格式显示博客帖子列表,并且希望修改create_time的外观(当前显示‘3.07,2020,10:16 a.m.',但我只想要2020-3-7 10:16);帖子文档可能太长,无法在单元格中显示,我想将其截短为150个单词。

那么,在列表视图中实现这一点的更好方法是什么呢?

(我在StackOverflow中读到了一些类似的问题,但它要么是在模板中完成的,比如修改时间,而这并没有解决我的第二个需求,要么就是太模糊了,无法理解)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-09 00:45:26

由于乔维奇建议我应该使用ModelSerializer,我设法让它在listView中工作。以下是我的解决方案:

序列化程序:

代码语言:javascript
运行
复制
class BlogListSerializer(serializers.ModelSerializer):
    create_time_str = serializers.SerializerMethodField()
    short_document_str = serializers.SerializerMethodField()

    class Meta:
        model = Blog
        fields = '__all__'

    def get_create_time_str(self, obj):
        return obj.create_time.strftime("%Y/%m/%d")

    def get_short_document_str(self, obj):
        return obj.document[0:150]

至于ListView:

代码语言:javascript
运行
复制
class BlogListView(ListView):
    model = Blog
    template_name = 'blog/posts.html'
    context_object_name = 'posts'
    ordering = ['-create_time']
    queryset = Blog.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        posts = context['posts']
        mod_posts = BlogListSerializer(posts, many=True)

        context['posts'] = mod_posts.data

        return context

BlogListSerializer(posts, many=True)接受帖子(一个帖子列表),并返回一个新的帖子列表,每个列表都有新的“属性”create_time_str和short_document_str。

在模板中,我只需要将其引用为<td>{{ post.create_time_str }}</td>

票数 0
EN

Stack Overflow用户

发布于 2020-03-08 02:57:47

如果您想要定制模型和视图之间的表示。一种更快的方法是使用DRF的serializerRetrieveAPIView。查看installation link。然后,您可以使用序列化程序来定制模型字段的表示。

下面是伪代码:

代码语言:javascript
运行
复制
from rest_framework import serializers
from rest_framework.generics import RetrieveAPIView

class BlogSerializer(serializers.ModelSerializer)
    def get_create_time(self, blog):
        return self.create_time..strftime("%m/%d/%Y, %H:%M)

    def get_document(self, blog):
        return self.document[:151]


class BlogPostListView(RetrieveAPIView):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer
    template_name = 'blog/posts.html'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60580841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档