【问题标题】:What happens in the background when you submit a class based view?当您提交基于类的视图时,后台会发生什么?
【发布时间】:2019-01-08 12:07:19
【问题描述】:

我正在使用基于类的通用视图,特别是 UpdateView。我目前拥有的其他对象可以按预期执行 CRUD。

现在,我创建了一个新对象,它也使用基于通用类的视图。我现在的问题是,当我提交更新表单时,我无法准确跟踪按下更新表单上的提交按钮时会发生什么。

它指向这个 url http://localhost:8000/order/question_update/

但我没有没有参数的 question_update url。我有一个 question_update url,最后有一个参数。

来自我的 urls.py

path('question_update/<int:pk>', views.QuestionUpdate.as_view(), name='question_update'),

而且成功的 url 也没有指向上面的 question_update url。

当我点击提交按钮时,我如何知道通用类 UpdateView 做了什么?我只想追踪它从哪里获取我没有在任何地方声明的 URL。

我对我的代码进行了文本搜索,但根本没有声明这个 url。

这是其他网址

path('question_list/<int:file_id>/', views.QuestionList.as_view(), name='question_list'),
path('question_create_param/<int:file_id>/', views.QuestionCreate.as_view(), name='question_create_param'),
path('question_update/<int:pk>', views.QuestionUpdate.as_view(), name='question_update'),

这是我对更新功能的看法

class QuestionUpdate(LoginRequiredMixin, UpdateView):
    login_url = 'login'
    model = Question
    form_class = QuestionForm

    def get_form(self, data=None, files=None, **kwargs): 
        kwargs['pk'] = self.kwargs['pk']
        return QuestionForm(data, files, **kwargs)

    def get_success_url(self):
        messages.success(self.request, 'Question updated')        
        obj = get_object_or_404(Question, pk=self.kwargs['pk'])
        return reverse_lazy('file_status:question_list', args=[obj])

这是我的模板

{% extends "base.html" %}

{% load bootstrap3 %}

{% block content %}
    <h1>Create/Update</h1>
    <form id="question_form" method="post" action="." class="form">
      {% csrf_token %}
      {% bootstrap_form form layout='vertical' %}
      {% buttons %}
        <button type="submit" class="btn btn-primary">Submit</button>
      {% endbuttons %}
    </form>
{% endblock %}

这也是我的模型

class Question(models.Model):
    file = models.ForeignKey(file, on_delete=models.CASCADE)
    query_type = models.CharField(max_length=255, null=True)
    date_sent = models.DateField(auto_now=False, auto_now_add=False, null=True)
    date_completed = models.DateField(auto_now=False, auto_now_add=False, null=True)
    responsible = models.CharField(max_length=255, null=True)
    status = models.CharField(max_length=255, null=True)
    remarks = models.CharField(max_length=255, null=True)

    def __str__(self):
        return str(self.file.id)

    def get_absolute_url(self):
        return reverse('file_status:question_detail', args=[str(self.id)])

【问题讨论】:

  • 请显示其余的 URL、视图本身和模板。
  • 你不是在urls.py 中使用router.register() 吗?
  • @hugo,不,先生,我不使用它。

标签: django


【解决方案1】:

看起来表单中的某些标签一开始就不应该存在。我所做的是回到 django 项目中的文档并确定应该如何正确声明它。

我的表格是这样开始的:

<form id="question_form" method="post" action="." class="form">

但应该只是这样:

<form id="question_form" method="post"> 

我不完全确定为什么 action 和 class 标签在提交更新表单时会导致错误,如果您知道请赐教。另一个奇怪的事情是,我的其他表单上有这 2 个额外的标签,但它只是碰巧在问题对象的 UpdateView 上失败。

这也是从 cookiecutter django crud 设计的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多