【问题标题】:TemplateView not working in django get_absolute_urlTemplateView 在 django get_absolute_url 中不起作用
【发布时间】:2019-01-02 05:49:52
【问题描述】:

我有一个report 应用程序来管理我项目中所有不当内容的标记。会员reporter 可以举报其他会员reported 发布不当内容。一切正常并创建了报告对象,但它最终不会重定向到感谢页面。但返回相同的表单页面。非常奇怪的是,当我在地址栏中粘贴http://127.0.0.1:8000/report/thanks/ 时,我惊讶地看到了表单页面。通常报告页面的 URL 为 http://127.0.0.1:8000/report/Amanda/ 这里到底出了什么问题。

下面是我的 models.py

class Report(models.Model):
    reporter = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='reporting_members')
    reported = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='reported_members')
    report_url = models.URLField(max_length=2000, blank=True, null=True)
    reported_at = models.DateTimeField(auto_now_add=True)
    reporting_choices = (
        ('1', 'The images posted by this user are not relevant to the Post),
        ('2', 'Rude or abusive content, The words chosen by the user are inappropriate'),
        ('3', 'This user is asking me to change my review in return for favor '),
        ('4', 'Other'),
    )
    reason_to_report = models.CharField(max_length=1, choices=reporting_choices)
    reason = models.TextField(blank=True, null=True)

    def __str__(self):
        return '{} is reporting {} for {}'.format(self.reporter, self.reported, self.reason_to_report)

    def get_absolute_url(self):
        return reverse('report:thanks')

以下是我的 views.py

class ReportCreateView(LoginRequiredMixin, CreateView):
    model = Report
    fields = ('reason_to_report', 'reason')

    def form_valid(self, form):
        form.instance.reporter = self.request.user
        form.instance.reported = User.objects.get(username=self.kwargs.get('username'))
        next = self.request.POST.get('next')
        form.instance.report_url = next
        super().form_valid(form)
        return redirect('report:thanks')




class ThanksView(LoginRequiredMixin, TemplateView):
    template_name = 'report/thanks.html'

下面是我的 urls.py

urlpatterns = [
    url(r'^(?P<username>[-\w]+)/$', views.ReportCreateView.as_view(), name='report_user'),
    url(r'^thanks/$', views.ThanksView.as_view(), name='thanks'),

]

下面是我的报告表单的模板

<form action="" method="post" >
    {% csrf_token %}
    {% bootstrap_form form %}
      <input type="hidden" name="next" value="{{ request.META.HTTP_REFERER }}">    
      <input class="btn btn-primary" type="submit" />
      <a href="{% url 'home' %}">
         <button class="btn btn-default">Cancel</button>
      </a>
 </form>

【问题讨论】:

    标签: django python-3.x django-templates django-views


    【解决方案1】:

    "thanks" 是您的用户名正则表达式的匹配字符串。 Django 总是采用第一个匹配的模式,所以会路由到 reportcreate 视图。

    交换 URL 模式的顺序。

    【讨论】:

    • 你到底是什么意思url(r'^thanks_you_for_reporting/$', views.ThanksView.as_view(), name='thanks'),
    • 呃,没有。我说要交换顺序,这样“thanks”模式就会出现在“report_user”模式之前。,
    • 有效的是有任何文档可以让我获得更多信息。我从来不知道 URS 的顺序实际上很重要
    • 都在URL dispatcher docs。请特别注意“Django 按顺序遍历每个 URL 模式,并在第一个匹配请求的 URL 时停止”这一行。
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 2013-04-06
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2018-03-13
    相关资源
    最近更新 更多