Автоматическое обновление поля слагов в UpdateView - PullRequest
1 голос
/ 30 октября 2019

У меня есть простой блог, в котором модель поста содержит поле слага, в котором предварительно указан заголовок поста. Я хотел бы знать, как обновлять этот слаг в фоновом режиме, когда пользователь обновляет заголовок сообщения в viewUpdate:

models.py

class Post(models.Model):
    title = models.CharField(max_length=150)
    content = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE
    )

    slug = models.SlugField(unique=True)

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'slug': self.slug})

    def save(self, *args, **kwargs):
        self.slug = self.slug or slugify(self.title)
        super().save(*args, **kwargs)

urls.py

urlpatterns = [
    path('post/<slug:slug>/', views.PostDetailView.as_view(), name='post_detail'),

]

views.py

class PostUpdateView(UpdateView):
    model = Post
    fields = ['title', 'content', 'tags']

Я предполагаю, что мне нужно добавить что-то еще в view.py, чтобы обновить слаг, но после нескольких часов, погуглив его, я мог быне найти его.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Это довольно простой вопрос, поэтому я не уверен, должен ли я предоставить что-то еще.

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете изменить метод save на:

class Post(models.Model):

    # &hellip;

    def save(self, *args, **kwargs):
        <b>self.slug = slugify(self.title)</b>
        super().save(*args, **kwargs)

При этом менять слизняк как таковое не является хорошей идеей. Пули обычно используются в URL. Таким образом, это означает, что если URL для Post, например, добавлен в закладки пользователем, а затем заголовок изменяется, то этот URL больше не будет работать. Поэтому слизень - это то, что не должно быть изменено (часто). Фактически в большинстве систем управления контентом (CMS) слаг не меняется, и вы можете посмотреть на URL, чтобы увидеть оригинальное название статьи.

...