我如何在Django中为一个预定义的类创建一个自定义的绝对url

8xiog9wr  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(101)

我需要在Django中创建一个博客,我有一个Blog类,声明如下:

models.py

class Blog(models.Model):
name = models.CharField(max_length=200, help_text='Enter name')
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)

User类是一个预定义的Django类。
正如你所看到的,对于Blogger,我没有创建一个类,而是使用了Django class User的默认类。在模板blog_list.html中,我使用以下行显示博客作者,并链接到作者页面:

blog_list.html

<a href="/blog/blogger/{{ blog.author.id }}">{{blog.author.first_name}} {{blog.author.last_name}}</a>

wiews.py

class BlogListView(generic.ListView):
    model = Blog
    ordering = ['-date']
    paginate_by = 5

class BloggerDetailView(generic.DetailView):
    model = User

url.py

urlpatterns = [
    path('', views.index, name='index'),
    path('blog/<int:pk>', views.BlogDetailView.as_view(), name='blog-detail'),
    path('blogs/', views.BlogListView.as_view(), name='blogs'),
    path('blogger/<int:pk>', views.BloggerDetailView.as_view(), name='blogger-detail'),
]

我的问题是如何声明一个absolute_urlblog.author不使用手动构造的/blog/blogger/{{ blog.author.id }}

w41d8nur

w41d8nur1#

你可以创建一个 * 代理模型 * [Django-doc],这不是一个新的(真实的)模型。在幕后,它使用User模型,但它将其转换为Author对象,我们可以向该Author对象添加逻辑:

from django.contrib.auth.models import User

class Author(User):
    class Meta:
        proxy = True

    def get_absolute_url(self):
        return reverse('blogger-detail', args=(self.pk,))

然后使用ForeignKey中的代理模型:

class Blog(models.Model):
    name = models.CharField(max_length=200, help_text='Enter name')
    author = models.ForeignKey(
        Author, on_delete=models.CASCADE, null=True, blank=True
    )

然后在模板中用途:

<a href="{{ blog.author.get_absolute_url }}">link</a>

相关问题