【问题标题】:django urls from models来自模型的 django url
【发布时间】:2013-12-14 21:05:27
【问题描述】:

我有以下型号:

class Articles(models.Model):
    status = models.CharField(choices=STATUSES, max_length=10, default='online')
    categ = models.ForeignKey(ArticlesCategories)
    title = models.CharField(max_length=64)
    content = models.TextField()

    def get_edit_url(self):
       return '/articles/add/%d' % self.pk

    edit_url = property(get_edit_url)

    def __unicode__(self):
        return self.title

    class Meta:
        db_table = 'articles'

和url路由:

    url(r'^add/(?P<article_id>\d+)$', views.add_article, name='edit_articles'),

如何编辑“get_edit_url”函数,以便动态生成编辑文章的 url 并且只能从 urls.py 更改路径?

谢谢

【问题讨论】:

    标签: python django url model


    【解决方案1】:

    This is a common problem,django 提供了使用reverse 函数的工具

    from django.core.urlresolvers import reverse
    
    def get_edit_url(self):
        # assuming your app isn't namespaced
        return reverse('edit_articles', args=(self.pk,))
        # if your app was namespaced it would be something like 
        # reverse('articles:edit_articles')
    

    【讨论】:

    • 在 Django 3 中,导入为 from django.urls import reverse
    【解决方案2】:

    我一般用reverse带模型方法:

    从 django.db 导入模型 从 django.core.urlresolvers 导入反向

    class MyModel(models.Model):
        ...
        def get_detail_url(self):
           return reverse('article-detail', args=(self.pk,))
    
        def get_list_url(self):
           return reverse('article-list')
    

    这种方法更加 RESTful,detail_view 将允许获取、删除、更新实例,list_view 将允许获取列表或最终进行批量删除/更新。

    【讨论】:

      【解决方案3】:

      您可以使用django-model-urls 自动执行此操作,甚至无需更改您的模型!

      使用你的例子:

      urls.py

      url(r'^add/(?P<id>\d+)$', views.add_article, name='edit_articles'),
      

      一些模板:

      {{ url('edit_articles', article) }}
      

      (注意当前版本使用jingo,原始Django模板可以使用0.3.1 version

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 2011-11-17
        • 2015-09-17
        • 2018-02-13
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多