【问题标题】:get id from url (or kwargs) for django class-based form从 url(或 kwargs)获取基于 django 类的表单的 id
【发布时间】:2015-02-01 02:53:06
【问题描述】:

我正在尝试使用基本表单将数据添加到我的应用程序中,但我已经设置了一个结构来将所有内容分成“项目”。

一切都由您选择的项目过滤,一个项目对用户有一个多对多键。

然后将我的网址设置为:

**//后端/项目

**//backend/projects[projid]/capabilities

然后当我添加一个“能力”元素时,我需要从 URL 或 kwargs 中读取“项目”ID

我如何访问capability_project(呈现表单模板时)

即提交按钮将用户重定向回正确的项目页面

<form id="capability-form" method="post" action="backend/projects/{{ project_capability }} /capabilities"> 

我认为因为它是多对多的,所以它会返回一个迭代器错误。我应该怎么做?以及添加项目时如何确保 project_id 值始终正确? // 编辑以更新 NoReverseMatch 错误我从显然无法访问表单的 kwargs 得到。

NoReverseMatch at /backend/projects/1/capabilities/add/
Reverse for 'capability-list' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
Request Method: POST
Request URL:    http://c9589d:8000/backend/projects/1/capabilities/add/

以及更多的跟踪信息

Request information

GET No GET data
POST Variable   Value
status  u'12'
domain  u'2'
capability_num  u'1'
level   u'a'
description u'asasd'
submit  u'Create Capability'
project u'1'
csrfmiddlewaretoken u'RW2vMwu3BhCOOhDTRaSeCglDSBCctqeF'
name    u'asdsd'

models.py

class Project(models.Model):
    proj_name = models.CharField()
    assigned_to = models.ManyToManyField(User, related_name='assigned_to')

class Capability(models.Model):
    name = models.CharField()
    project = models.ManyToManyField(Project)
    current_status = models.BooleanField()
    future_status = models.NullBooleanField()

class Function(models.Model):
    name = models.CharField()
    capability = models.ForeignKey(Capability)
    current_status = models.BooleanField()
    future_status = models.NullBooleanField()

views.py

class Add_Capability(CreateView):
    template_name = 'backend/add_capability.html'
    model = Capability
    fields = ['name', 'description', 'status', 'capability_num', 'project', 'domain']
    form_class = CapabilityForm

forms.py

class CapabilityForm(forms.ModelForm):
    name = forms.CharField(max_length=255, help_text="Please enter a name for the capability")
    description = forms.CharField(max_length=255, help_text="Please enter a description for the capability")
    status = models.CharField(max_length=255, choices=STATUS_CHOICES, default="Approved")
    capability_num = forms.DecimalField(max_digits=5, decimal_places=4, help_text="Enter a number")
    project = models.ManyToManyField(Project, null=True)
    level = models.CharField(max_length=1, choices=LEVELS_CHOICES, default="Approved")
    domain = models.ManyToManyField(Domain)

    class Meta:
        model = Capability
        fields = ('name', 'description',)

urls.py

# /backend/1/capabilities
url(r'^projects/(?P<capability_project>\d+)/capabilities/$', views.CapabilityList.as_view(), name='capability-list'),

# /backend/capabilities/add - Add capabilities
url(r'^projects/(?P<capability_project>\d+)/capabilities/add/$', views.Add_Capability.as_view(), name='add-capability'),

# /backend/projects
url(r'^projects/$', views.ProjectList.as_view(), name='projects'),

【问题讨论】:

  • 我不确定您为什么要在表单操作中指定任何内容。需要回发到同一个AddView,否则不处理。
  • 粘贴你得到的错误回溯
  • Add_Capability 视图的定义中是否包含 form_class = CapabilityForm
  • 我今晚回家时会添加错误,但我想在成功回发后重定向到“projects/1/capabilities”页面(取决于项目 ID)。 @Anentropic,我在上面展示了整个表单类,它需要一个 form_class 定义吗?
  • 好的,但这应该在视图的get_redirect_url 方法中完成,而不是在表单操作中。

标签: django django-forms django-views django-class-based-views


【解决方案1】:

在views.py中你可以通过这种方式访问​​kwargs:

class Add_Capability(CreateView):
    template_name = 'backend/add_capability.html'
    model = Capability
    fields = ['name', 'description', 'status', 'capability_num', 'project', 'domain']
    form_class = CapabilityForm
    project_id = False

    def get_success_url(self):
        self.success_url = reverse('project-detail')+self.kwargs['capability_project']+'/'
        return super(Add_Capability, self).get_success_url()

【讨论】:

  • 你不应该使用像def get_absolute_url(self): return reverse('project-detail', kwargs={'capability_project': self.capability_project})这样的东西
  • 我得到以下信息:mproperlyConfigured at /backend/projects/1/capabilities/add/ No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model. Request Method: POST
  • @heymishy 我已经编辑了代码。我添加了一个 get_success_url 函数。
  • 谢谢,它几乎就在那里,除了它似乎没有正确地访问 kwargs 的值。我已经用附加信息编辑了我上面的帖子
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2017-03-22
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
相关资源
最近更新 更多