有没有什么好方法可以修改列表视图中的各个数据字段?例如,我有一个博客文章模型,它看起来像
class Blog(models.Model):
create_time = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=250)
document = models.TextField(blank=True)我的列表视图如下所示:
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中读到了一些类似的问题,但它要么是在模板中完成的,比如修改时间,而这并没有解决我的第二个需求,要么就是太模糊了,无法理解)。
发布于 2020-03-09 00:45:26
由于乔维奇建议我应该使用ModelSerializer,我设法让它在listView中工作。以下是我的解决方案:
序列化程序:
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:
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 contextBlogListSerializer(posts, many=True)接受帖子(一个帖子列表),并返回一个新的帖子列表,每个列表都有新的“属性”create_time_str和short_document_str。
在模板中,我只需要将其引用为<td>{{ post.create_time_str }}</td>。
发布于 2020-03-08 02:57:47
如果您想要定制模型和视图之间的表示。一种更快的方法是使用DRF的serializer和RetrieveAPIView。查看installation link。然后,您可以使用序列化程序来定制模型字段的表示。
下面是伪代码:
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'https://stackoverflow.com/questions/60580841
复制相似问题