python - 无法从 CreateView 重定向

标签 python django

我是 Django 新手,缺乏经验,试图实现基于类的 View ,但完全陷入尝试设置 success_url 的困境。

我尝试了两种我认为基于 Google 最接近正确的方法,但不确定哪一种最不被破坏:

  1. success_url = 'letters/home' -> 导致意外重定向/letters/write/letters/home 而我希望它转到/letters/home

  2. reverse_lazy('letters:home') 会导致“找不到 'home' 的反向操作。'home' 不是有效的 View 函数或模式名称。”

这是我的代码:

查看

from .models import Topic
from django.views.generic.edit import CreateView
from django.views.generic import TemplateView
from django.urls import reverse_lazy
from .forms import WriteLetterForm


class HomeView(TemplateView):
    template_name = 'letters/letter/home.html'


class WriteLetterView(CreateView):
    template_name = 'letters/letter/write_letter.html'
    form_class = WriteLetterForm
    success_url = 'letters/home' # reverse_lazy('letters:home')
    # success_url = 'letters/home'
    # success_url = reverse_lazy('HomeView')


    def form_valid(self,form):
        form.instance.author = self.request.user
        form.instance.topic = Topic.objects.get(slug=self.kwargs['slug'])
        result = super(WriteLetterView,
                       self).form_valid(form)
        cd = form.cleaned_data
        # user = authenticate(username=cd['username'],
        #                    password=cd['password1'])
        # login(self.request, user)

        return result

应用内的 urls.py

from django.urls import path
from . import views
app_name = 'letters'


urlpatterns = [
    path('home/', views.HomeView.as_view()),
    path('write/<str:slug>', views.WriteLetterView.as_view()),
]

forms.py

from django import forms
from .models import Letter
from braces.forms import UserKwargModelFormMixin

class WriteLetterForm(UserKwargModelFormMixin, forms.ModelForm):
    #letter = forms.ModelChoiceField(queryset=Letter.objects.all())

    class Meta:
        model = Letter
        fields = ['body', 'picture_1', 'picture_2', 'picture_3']


    def create(self):
        obj = super(WriteLetterForm, self).save(commit=False)
        obj.author_id = self.user
        obj.save()
        return obj

我哪里出错了? :(

最佳答案

urlpatterns = [
    path('home/', views.HomeView.as_view(),name="home"),
    path('write/<str:slug>', views.WriteLetterView.as_view()),
]


 success_url = reverse_lazy('letters:home')

这样就可以了,因为您还没有命名主页网址,因此它显示找不到网址

关于python - 无法从 CreateView 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489175/

相关文章:

python - xtensor 的 "operator/"比 numpy 的 "/"慢

python - 为什么django不能在数据库之外设置属性?

javascript - 从后端代码发送数据到 bootstrap-notify

python - 将 Bash 脚本的剩余 `n-2` 个参数提供给调用的命令

python - 如何将控件导航到顶级功能

python - 为什么 <for i 在 obj :> and <for i in iter(obj):> equivalent?

python - 构建具有动态数量字段的 Django 优雅过滤器

python - 在 pig 中注册 python UDF 时遇到 IOException。文件 helloworld.py 不存在

django - 将 Django 模型类名获取到字段中

django - 如何从 Django 中的方法正确返回值?