【问题标题】:Django Modelform Redirect to form-submitted contentDjango Modelform 重定向到表单提交的内容
【发布时间】:2017-06-21 12:48:08
【问题描述】:

免责声明:在这方面还是很新的。

我已经成功建立并运行了一个记录攀岩的网站。我有一个功能表单,允许用户向目录提交新项目,但无法弄清楚如何将他们重定向到新创建的页面。这是我的代码:

("..." 代替我认为不相关且庞大的代码。如果您需要它,请告诉我!)

forms.py:

class PostForm(forms.ModelForm):
    class Meta:
        model = MyDB
        fields = (...)
    def save(self):
        instance = super(PostForm, self).save(commit=False)
        instance.slug = slugify (instance.name)
        instance.save()

        return instance

views.py:

def post_new(request):
    things = MyDB.objects.order_by('name')
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            created_at = timezone.now()
            updated_at = timezone.now()
            form.save()
            return render(request, 'DB.html', {
                'things': things,
            })
    else:
        form = PostForm()
    return render(request, 'things/submit_thing.html', {'form': form})

models.py:

from django.db import models

class MyDB(models.Model):
    ...
    slug = models.SlugField(unique=True)

和 urls.py:

url(r'^things/(?P<slug>[-\w]+)/$', views.thing_detail, name='thing_detail'),
url(r'^post/new/$', views.post_new, name='post_new'),

现在我只是让它重定向到一个静态 html 页面,因为我不知道如何让它加载新创建的页面。我试过使用重定向功能,但不确定如何将新创建的页面指定为目标。

谢谢!

编辑:这是工作代码:

from django.shortcuts import render, redirect, reverse

def post_new(request):
    things = MyDB.objects.order_by('name')
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            created_at = timezone.now()
            updated_at = timezone.now()
            thing = form.save()    
            return redirect(reverse('thing_detail', kwargs={'slug': thing.slug})
            )
    else:
        form = PostForm()
    return render(request, 'things/submit_thing.html', {'form': form})

【问题讨论】:

  • 你想把用户重定向到哪里?
  • 到“名称”字段的 slugified 版本。例如,如果他们提交了名为“Bob is great”的表单,它将重定向到 /things/bob-is-great/,这是他们刚刚提交的数据的生成视图
  • form.save()的结果赋值给一个变量,例如instance = form.save()。然后你可以使用instance.slug

标签: python django forms redirect


【解决方案1】:

来自docs

您可以使用redirect 快捷方式和reverse 函数来反向解析名称,在您的情况下:

thing = form.save()    
redirect(reverse('thing_detail', kwargs={'slug': thing.slug))

【讨论】:

  • 尝试将其插入我的代码中,并将其添加到标头中的导入中,但运气不佳。获取“QuerySet”对象没有属性“slug”错误。我用更新后的代码更新了原始帖子。
  • @Josh thing 我的意思是MyDB 实例,请参阅编辑
  • 请注意,您不需要 reverseredirectredirect('thing_detail', slug=thing.slug)redirect(reverse('thing_detail', kwargs={'slug': thing.slug)) 的作用相同。
  • 有效!必须在开头添加“return”,并使用 ) 和 } 更改一些语法,但它现在可以工作了。谢谢!我将工作代码添加到我的原始帖子中。
猜你喜欢
  • 2013-08-11
  • 2018-07-21
  • 2021-10-29
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多