Как я создаю краткий заголовок в Django?

Факториал растет очень быстро . 13! уже находится вне диапазона, представляемого 32-разрядным целым числом без знака. Арифметика без знака возвращает остаток, когда результат не может быть представлен, то есть вы получаете только младшие биты истинного математического результата. Вы могли бы пойти немного выше, используя более широкий тип данных, но не намного. Вам нужен арифметический пакет произвольной точности и много памяти, чтобы идти гораздо дальше.

А почему вы получаете результат за 34! равно нулю , обратите внимание, что среди факторов 1 * 2 * 3 * ... * 33 * 34 есть 17, кратные двум, 8 из которых также кратны 4, 4 из которых также кратны 8, два из которых кратны 16, и один из которых равен 32. В общей факторизации математического результата это 32 32 с, поэтому остаток по модулю 2 32 равен нулю. [ 111]

210
задан daaawx 10 May 2019 в 08:34
поделиться

4 ответа

Вам нужно будет использовать функцию slugify.

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

Вы можете вызвать slugify автоматически, переопределив метод save :

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

Имейте в виду, что приведенное выше изменение приведет к изменению вашего URL, когда поле q отредактировано, что может вызвать неработающие ссылки . Может быть предпочтительнее генерировать слаг только один раз, когда вы создаете новый объект:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)
396
ответ дан 23 November 2019 в 04:33
поделиться

Если вы используете интерфейс администратора для добавления новых элементов вашей модели, вы можете настроить ModelAdmin в своем admin.py и используйте prepopulated_fields для автоматизации ввода слага:

class ClientAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Client, ClientAdmin)

Здесь, когда пользователь вводит значение в форме администратора для поля имя , слаг будет будут автоматически заполнены правильным кратким именем .

29
ответ дан 23 November 2019 в 04:33
поделиться

В большинстве случаев слаг не должен изменяться, поэтому вы действительно хотите рассчитать его только при первом сохранении:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(Test, self).save()
22
ответ дан 23 November 2019 в 04:33
поделиться

Небольшая поправка к ответу Зипера: Чтобы переопределить функцию save () в классах модели, лучше добавьте к ней аргументы:

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.id:
        self.s = slugify(self.q)

    super(test, self).save(*args, **kwargs)

В противном случае, test.objects .create (q = "бла-бла-бла") приведет к ошибке force_insert (неожиданный аргумент).

62
ответ дан 23 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: