0

我正在尝试使用基本表单向我的应用添加数据,但我已经设置了一个将所有内容分离为“项目”的结构。从django基于类的表单中获取url(或kwargs)的id

一切都按照您选择的项目过滤,并且项目对用户具有manytomanykey。

我的网址然后设置为:

** //后端/项目

** //后端/项目[PROJID] /能力

后来,当我加入“功能“元素,我需要阅读了”从URL项目的ID或kwargs

我怎么访问capability_project(渲染表单模板时)

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

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

我想是因为它是一个多对多的,它返回一个迭代器错误。我应该怎么做?以及如何在添加项目时确保project_id值始终正确? //编辑为更新NoReverseMatch错误即时获取从aparently无法访问形式的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'), 
+0

我不知道你为什么要指定表单的动作什么。它需要回发到相同的AddView,否则它将不会被处理。 – 2014-12-03 14:06:45

+0

粘贴你得到的错误回溯 – Anentropic 2014-12-03 14:09:50

+0

'Add_Capability'视图在其定义中有'form_class = CapabilityForm'吗? – Anentropic 2014-12-03 14:10:57

回答

-1

在您可以访问kwargs这样的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 
    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() 
+1

是不是你应该使用'def get_absolute_url(self): return reverse('project-detail',kwargs = {'capability_project':self.capability_project})' – heymishy 2014-12-03 22:32:44

+0

我得到以下结果:'mproperlyConfigured at/backend/projects/1/capabilities/add/ 没有要重定向到的URL。在Model上提供一个url或定义一个get_absolute_url方法。 请求方法:\t POST' – heymishy 2014-12-03 22:52:54

+0

@heymishy我编辑了代码。我已经添加了get_success_url函数。 – 2014-12-04 09:06:44