Django, von PK zu slug urls

Django, Flask, Bottle, WSGI, CGI…
Antworten
jinroo
User
Beiträge: 12
Registriert: Dienstag 13. Oktober 2015, 16:30

Hi,

ich möchte einige URLs umstellen von PK zu slugfields.

Der aktuelle code sieht so aus:

Code: Alles auswählen

urlpatterns = [
    url(r'^$', views.MemoriesIndexListView.as_view(), name='index'),
    url(r'^(?P<slug>[-\w]+)/$', views.MemoriesDetailView.as_view(), name='detail'),
    url(r'^add/(?P<slug>[-\w]+)/$', views.CreateCommentView.as_view(), name='add_comment'), #slug
    #url(r'^add-comment/(?P<question_id>\d+)/$', views.CreateCommentView.as_view(), name='add_comment'), #PK
]

Code: Alles auswählen

views.py
class CreateContentView(LoginRequiredMixin, CreateView):
    model = Content
    fields = ["content", ]
    message = _("Thank you! Your answer has been posted.")

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.question_id = self.kwargs["question_id"]
        return super().form_valid(form)

    def get_success_url(self):
        messages.success(self.request, self.message)

        return reverse("remember:index")
        #return reverse("remember:question_detail", kwargs={"pk": self.kwargs["question_id"]})

Code: Alles auswählen

models.py 
class Memories(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='remember_user')
    timestamp = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=200, null=True, blank=True)
#gekürzt


    def save(self, *args, **kwargs):
        if self.slug:  # edit
            if slugify(self.firstname+"-"+self.lastname) != self.slug:
                self.slug = generate_unique_slug(Memories, self.firstname+"-"+self.lastname)
        else:  # create
            self.slug = generate_unique_slug(Memories, self.firstname+"-"+self.lastname)
        super(Memories, self).save(*args, **kwargs)
        
class Content(models.Model):
    question = models.ForeignKey(Memories, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='remember_content_user')
    content = MarkdownxField()
    uuid_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-timestamp"]
        verbose_name = _("Content")
        verbose_name_plural = _("Content")

    def __str__(self):
        return self.content
        

Dazu habe ich an und für sich 2 Fragen bzw. Probleme

Das eine ist, dass die die URL erst garnicht aufrufen kann.
NoReverseMatch
Das andere, (das kommt erst später), wie kann ich dann beim speichern zurück auf die detail url?
Aktuell wird das in der views mit

Code: Alles auswählen

return reverse("remember:question_detail", kwargs={"pk": self.kwargs["question_id"]})
Aber eben mit der PK,

Code: Alles auswählen

return reverse("remember:index")
das ist nur die halbe Miete. Das geht zurück auf die Übersicht, was es ja nicht soll.
Antworten