Django表单后重定向不可靠,需要成功

2024-04-16 07:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我完全无法理解这种行为,并找到了一个我不太喜欢的解决办法。谁能帮我开导一下吗?上下文是我有一个引导样式的表单来创建新记录(继承自通用.CreateView)在

在网址.py公司名称:

url(r'^$', home, name='home'),
url(r'^main/$', views.MainView.as_view(), name='MainView'),
url(r'^topic/(?P<pk>[0-9]+)/$', catalogue_views.TopicView.as_view(), name='TopicView'),
url(r'^resource/(?P<pk>[0-9]+)/$', catalogue_views.DetailView.as_view(), name='ResourceDetail'),
url(r'^contribute/$', catalogue_views.ContributeView.as_view(success_url="/main/"), name='Contribute'),

在视图.py公司名称:

^{pr2}$

在表单.py公司名称:

class ContributeForm(forms.ModelForm):
    class Meta:
        model = CatalogueItem
        fields = ['title', 'topic_area', 'description', 'link', 'what_learn', 'how_apply', 'level', 'relevant_to', 'discovered_by']

    ROLE_CHOICES = [[x.id, x.job] for x in JobType.objects.all()]

    title = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'To sell this resource to others'}), max_length=80, required=True)
    description = forms.CharField(widget=forms.Textarea(attrs={'rows': 2, 'placeholder': 'Clear, e.g. format, duration, activities...'}))
    link = forms.CharField(widget=forms.URLInput(attrs={'placeholder': 'If required, link to resource http://...'}), required=False)
    what_learn = forms.CharField(widget=forms.Textarea(attrs={'rows': 3, 'placeholder':"This is important,."}), label='What will you learn?')
    how_apply = forms.CharField(widget=forms.Textarea(attrs={'rows': 3, 'placeholder':"How could this be put into action afterwards?"}), label='How could you apply this?')
    relevant_to = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=ROLE_CHOICES)

以及带有表单的模板:

<div class="container">
        <div class="entry-form row">
            <div class="col-md-10 col-md-offset-1 col-sm-10 col-sm-offset-1 col-xs-10 col-xs-offset-1">
                <form action="{% url 'MainView' %}" method="post" class="form">
                    <input type="hidden" name="next" value="{{ next }}">
                    {% bootstrap_form form %}
                    <button class="btn btn-primary btn-lg" type="submit">Submit Suggestion</button>
                    {% csrf_token %}
                </form>
        </div>
    </div>

表单工作正常,数据被很好地保存到数据库中。问题是之后,浏览器转到正确的URL/main/但屏幕是空白的。服务器显示http4050,如果我刷新页面,它就会工作。在

如果我修改了模板,使action=“{%url”贡献“%}”返回到同一个表单,我将得到http500和一条关于“No url to redirect to”的Django消息。所以两个不同的误差决定了重新定向定位。在这两种情况下,如果我只需在浏览器的url字段中单击并单击return就可以了。在

我确信这个方法一开始是有效的,后来坏了,但我解决了如下问题。在success\u url中使用其路径的硬代码

url(r'^contribute/$', catalogue_views.ContributeView.as_view(success_url="/main/"), name='Contribute'),

正在删除模板中的任何操作链接:

<form action="" method="post" class="form">

这是正确的方法吗?为什么,尽管使用了正确的url,但是页面没有加载或使用我原来的方法给出错误?我很想了解这个。在


Tags: tonameformviewurl表单ascol
1条回答
网友
1楼 · 发布于 2024-04-16 07:31:02

你确定你的数据确实保存在服务器上吗?从你的帖子来看,这似乎不太可能。以下是Django遵循的正常流程:

  1. 进入窗体视图(ContributeView) →返回空表单
  2. 在窗体视图上发布(ContributeView) →如果无效,请返回步骤1。如果有效,则返回302 Redirectsuccess_url。在
  3. 登录成功网址

因此,通常情况下,在模板中,表单操作应该是空的,因此表单被发布回生成它的视图。并且ContributeView应该有一个成功的url,该url将重定向到您希望在之后将用户发送到的任何位置:

from django.core.urlresolvers import reverse_lazy
class ContributeView(generic.CreateView):
    # other stuff
    success_url = reverse_lazy('MainView')

405的行为是因为浏览器试图将表单直接发送到MainView,而不是表单视图,它告诉浏览器它不知道如何处理POST方法。在

相关问题 更多 >