Django get_absolute_url () возвращение пользователя на домашнюю страницу - PullRequest
0 голосов
/ 15 марта 2019

Когда пользователь создает сообщение, используя CreateView, я хочу, чтобы, когда пользователь отправлял сообщение, он затем видел сообщение, которое он только что сделал.Но по какой-то причине мой get_absolute_url() не работает.

До этого я начал работать над прореживанием моделей Post и Category и не мог увидеть, работают ли они из-за факта get_absolute_urlне будет работать.

Модели:

class Category(models.Model):
    title = models.CharField(max_length=200)
    colorcode = models.CharField(max_length=20, blank=True, null=True)
    description = models.TextField()
    image = models.ImageField(blank=True, null=True)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.title

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)
    image = models.ImageField(blank=True, null=True)
    live = models.BooleanField(default=False)
    slug = models.SlugField(unique=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

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

def create_slug(instance, new_slug=None):
    slug = slugify(instance.title)
    if new_slug is not None:
        slug = new_slug
    qs = Post.objects.filter(slug=slug).order_by("-pk")
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" %(slug, qs.first().pk)
        return create_slug(instance, new_slug=new_slug)
    return slug

def pre_save_post_reciever(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)


pre_save.connect(pre_save_post_reciever, sender=Post)

Просмотров:

class IndexView(ListView):
    model = Post
    queryset = Post.objects.filter(live=True)
    template_name = "public/index.html"

class PostEdit(object):
    model = Post
    fields = '__all__'
    success_url = '/'

class PostCreateView(LoginRequiredMixin, PostEdit, CreateView):
    fields = ['title', 'text', 'category', 'image']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

class PostUpdateView(LoginRequiredMixin, PostEdit, UpdateView):
    fields = ['title', 'text', 'category', 'image']

Если у кого-нибудь есть идеи, как это исправить, это было бы здорово!

1 Ответ

2 голосов
/ 15 марта 2019

Если ведет себя в соответствии с этим определением:

class PostEdit(object):
    model = Post
    fields = '__all__'
    success_url = '/'    # <<<---

В вашем случае success_url не является статическим и не может быть определено как атрибут.Вы должны переопределить get_success_url вместо этого так:

def get_success_url(self):
     return self.get_object().get_absolute_url()

также взгляните на этот ответ .

upd

Если перенаправление так просто, то, как упоминал Дэниэл Роузман, вам вообще не нужно указывать success_url - вам нужно поведение по умолчанию .

Вам даже не нужно предоставлять success_url для CreateView или UpdateView - они будут использовать get_absolute_url () для объекта модели, если он доступен.

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