重定向功能的首选参数

时间:2016-02-16 01:59:47

标签: python django

最近我决定当用户创建类别页面然后重定向到创建的类别页面。事情是,为此,我没有使用slu or或id。我使用category_name = decode_url(category_name_url)作为return redirect('category', blank) 应该是什么空白?

我尝试了category_name和category_name_url,但两者都不起作用。我该放什么?

这是我的代码

def category(request, category_name_url):
    user = User.objects.get(username=request.user)
    category_name = decode_url(category_name_url)
    more in the below....

@login_required
def add_category(request, category_name_url):
    category_name = decode_url(category_name_url)

    category = Category.objects.get(name=category_name)

    if not request.user.is_superuser and Category.objects.filter(author=request.user).exists():
        return render(request,'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, request.FILES, instance=category)
        if form.is_valid():
            form.save(commit=True)
            return redirect('category', category_name)

    else:
        form = CategoryForm()

    return render(request, 'main/add_category.html', {'form':form})

urls.py

        url(r'^category/(?P<category_name_url>\w+)/$', views.category, name='category'),

根据我的尝试,我得到add_category()只需要2个参数(给定1个)

1 个答案:

答案 0 :(得分:2)

重定向使用反向。你有一个命名参数,反之如下:

reverse("category",kwargs={'category_name_url':category_name})

重定向:

return redirect("category",category_name_url=category_name)

在该功能中,您必须获取类别名称:

...

    if request.method == 'POST':
            category = Category(author=request.user)
            form = CategoryForm(request.POST, request.FILES, instance=category)
            if form.is_valid():
                category = form.save(commit=True)
                return redirect("category",category_name_url=category.category_name)

Django实际上允许您使用任何字段定义对象URL,而不仅仅是slug或id。因此,您可以将以下方法添加到模型中:

from django.core.urlresolvers import reverse
...
    def get_absolute_url(self):
       return redirect(reverse('category',kwargs={'category_name_url':self.category_name})

然后,以你的形式:

return redirect(category)

注意:reverse接受kwargs,而不接受** kwargs,因此您必须传递显式字典。使用重定向时,显式命名参数。