【问题标题】:Django - models.py - Does get_absolute_url function take conditions?Django - models.py - get_absolute_url 函数是否有条件?
【发布时间】:2020-02-07 10:39:58
【问题描述】:
class Category(models.Model):
    '''Category for men's and women's items'''
    gender = models.IntegerField(choices=[
        (1, 'Women'),
        (2, 'Men'),
    ], default=1)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=300, blank=True)
    uploaded_date = models.DateTimeField(
        auto_now_add=True, null=True, blank=True)

    class Meta():
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.get_gender_display() + ' ' + self.name

    def get_absolute_url(self):
        if # condition: more than 1 value passed from url
            return reverse('boutique:category', kwargs={'gender': self.get_gender_display(), 'category_pk': self.pk})
        else:  
            return reverse('boutique:show-all', kwargs={'gender': self.get_gender_display()})

问题:如何计算出get_absolute_url 函数更动态地工作的逻辑?或者它不应该动态工作?在上面的 if 语句中,我想放置一个条件来检查从 url 传递的值的数量,以便它可以决定要呈现哪个视图。是否可以?还是我应该单独创建get_FOO_url() 函数,以使用从 url 传入的不同值来渲染每个视图?

【问题讨论】:

    标签: python django url django-models


    【解决方案1】:

    由于模型本身对请求一无所知,因此没有任何帮助是不可能的。

    我个人更喜欢https://pypi.org/project/django-middleware-global-request/,它正是为此目的而设计的。

    from django_global_request.middleware import get_request
    
    class TestModel(models.Model):
    
        ...
    
        def get_absolute_url(self):
            request = get_request()
    
            if request.GET.get('whatever'):
                return ...
            else:
                return ...
    
    

    您只需要确保,您仍然可以在没有任何可用请求的情况下访问此方法。因此,请确保它是故障安全的,并且在没有请求的情况下具有回退功能(例如在 shell、升级等中)

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多