Django - models.py - Функция get_absolute_url принимает условия? - PullRequest
2 голосов
/ 07 февраля 2020
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()})

Вопрос : как отработать функцию logi c для get_absolute_url для более динамичной работы? Или это не должно работать динамически? В приведенном выше операторе if я хочу разместить условие, которое проверяет, сколько значений передано из URL, чтобы он мог решить, какое представление отображать. Является ли это возможным? или я должен просто создать get_FOO_url() функцию отдельно для рендеринга каждого представления с различными значениями, передаваемыми из URL?

1 Ответ

2 голосов
/ 07 февраля 2020

Поскольку сама модель ничего не знает о запросе, без помощи это невозможно.

Я лично предпочитаю 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, upgrade и т. Д. c.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...