【问题标题】:Django Muliple Variables in URL with database update带有数据库更新的 URL 中的 Django 多个变量
【发布时间】:2015-07-25 11:21:05
【问题描述】:

在我的 URL 中添加额外变量时遇到了一些问题。我目前将其设置为:

url(r'^(?P<blog_id>[0-9]+)/?$', 'blog.views.blog_show', name='show'),

不过我也想在标题中加入 slug:

url(r'^(?P<blog_id>[0-9]+)/(?P<blog_slug>\S+)/?$', 'blog.views.blog_show', name='show'),

我已经设法让它工作了,但是当我的用户在我的博客上更新 cmets 时,发生了一些有趣的事情,因为它没有记录到数据库并且没有正确重定向。

urls.py

urlpatterns = [
    # Examples: /blogs
    url(r'^$', 'blog.views.index', name='index'),
    url(r'^new$', 'blog.views.new', name='new'),
    url(r'^create$', 'blog.views.create', name='create'),
    url(r'^(?P<blog_id>[0-9]+)/?$', 'blog.views.blog_show', name='show'),
    url(r'^(?P<blog_id>[0-9]+)/edit$', 'blog.views.blog_edit', name='edit'),
    url(r'^(?P<blog_id>[0-9]+)/update$', 'blog.views.blog_update', name='update'),
    url(r'^(?P<blog_id>[0-9]+)/delete$', 'blog.views.delete_blog', name='delete'),
    url(r'^(?P<blog_id>[0-9]+)/new_comment$', 'blog.views.new_comment', name='comment'),
    # url(r'^blog/', include('blog.urls')),
]

views.py

def new_comment(request, blog_id, blog_slug):
    #blog = Blog.objects.get(pk=blog_id)
    blog = get_object_or_404(Blog, pk=blog_id)
    c = Comment()
    c.comment_content = request.POST['comment_content']
    c.blog_id = blog
    c.user_id = User.objects.all()[0]
    c.save()
    return HttpResponseRedirect(reverse('show', args=(blog.id,)))

def blog_show(request, blog_id, blog_slug):
    #blog = Blog.objects.get(pk=blog_id)
    blog = get_object_or_404(Blog, pk=blog_id)
    comment_obj = blog.comment_set.all().order_by('-id')

    paginator = Paginator(comment_obj, 2)

    page = request.GET.get('page')

    try:
        comment_list = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        comment_list = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        comment_list = paginator.page(paginator.num_pages)

    template_hash = {'comment_list':comment_list,'blog':blog}
    return render(request, 'blog/show.html',template_hash)

show.html

{% load django_markdown %}

<h1>{{ blog.blog_title }}</h1>
<p>
    {{ blog.blog_content|markdown}}
</p>
<form action = '/blogs/{{blog.id}}/{{blog.slug}}/new_comment' method = "post">{% csrf_token %}
            <div>New Comment:<br><textarea type = "text" name ='comment_content'></textarea></div>
            <input type = "submit" value = "Submit">
</form>
<h3>Comments</h3>
{% if comment_list %}
    {% for comment in comment_list %}
        <p>{{comment}}</p>

    {% endfor %}

{% else %}
    <p>No Comments</p>
{% endif %}

<div class="pagination">
    <span class="step-links">
        {% if comment_list.has_previous %}
            <a href="?page={{ comment_list.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ comment_list.number }} of {{ comment_list.paginator.num_pages }}.
        </span>

        {% if comment_list.has_next %}
            <a href="?page={{ comment_list.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

我遇到的问题是,当我将它重定向并记录到数据库时,cmets 将不再记录,并且重定向卡在http://localhost:8000/blogs/1/my-first-blog/new_comment。而不是仅仅去http://localhost:8000/blogs/1/my-first-blog/

我虽然通过更新下面的内容它会正确重定向但它没有

 <form action = '/blogs/{{blog.id}}/{{blog.slug}}/new_comment' method = "post">{% csrf_token %}

任何帮助将不胜感激。

【问题讨论】:

  • 您能否在上下文中显示该新 URL 与其他现有 URL?
  • 是的。不太担心其他人,因为当我完成这项工作时,我可以将相同的理论应用于他们。我尝试将显示和评论网址更新为以下内容: url(r'^(?P[0-9]+)/(?P\S+)/?$', 'blog .views.blog_show', name='show'), url(r'^(?P[0-9]+)/(?P\S+)/new_comment$', 'blog.views .new_comment', name='comment'), 但还是没有骰子

标签: django


【解决方案1】:

问题是\S+ 匹配所有字符串字符,包括“/”。因此,正则表达式 '^(?P&lt;blog_id&gt;[0-9]+)/(?P&lt;blog_slug&gt;\S+)/?$ 匹配“1/my_blog/new_comment”,您的表单最终会提交到显示视图而不是添加评论视图。

使用\w+ 代替仅匹配字母数字字符。

【讨论】:

  • 不幸的是,当我更改为 \w+ 时出现错误,NoReverseMatch.Reverse for 'show' with arguments '(1, 'my-first-blog')' 和关键字参数 '{}' not成立。尝试了 1 种模式:['blogs/(?P[0-9]+)/(?P\\w+)?$']
  • 尝试[\w-]+ 来匹配连字符和字母数字字符。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 2016-04-08
  • 2020-06-23
  • 2020-08-14
  • 2021-11-15
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多