2014-06-23 34 views
0

我是基于django类的新视图,我想知道如何在使用createview或detailview时重置表单中的初始值?django createview,如何重置表单中的初始值?

这里是我的代码:

class DepartFormCreateView(CreateView): 
    model = Departs 
    fields = ['depth', 'orders', 'lead', 'name','type','Unit','parent'] 
    template_name = "depart_form_create_view.html" 
    form_class = DepartsForm 
    success_url = '/' 

    def get(self, request, *args, **kwargs): 
     self.fields['Unit'].queryset = Units.objects.filter(status = 200, parent__id = 2) 
     return super(DepartFormCreateView, self).get(request, *args, **kwargs) 

    def form_valid(self, form): 
     #objects = form.save() 
     #self.object = form.save() 
     dep = form.save(commit = False) 
     dep.addtime = datetime.datetime(1900, 1, 1) 
     dep.rights = 200 
     dep.status = 100 
     dep.save() 
     return super(DepartFormCreateView, self).form_valid(form) 

我得到了一个“列表索引必须是整数,而不是STR”的错误,我已经检查的源代码,可能的方法,我需要重写是得到()在ProcessFormView类中,错误在哪里?或者我重写错误的方法?任何帮助将深受赞赏。

PS:forms.py

类DepartsForm(的ModelForm):

class Meta: 
    model = Departs 
    fields = ('depth', 'orders', 'lead', 'name','type','Unit','parent's) 

def clean(self): 
    cleaned_data = super(DepartsForm, self).clean() 
    validation code..... 

models.py

class Departs(models.Model): 
    CHOICES_TYPE = (
    (15, 'sales'), 
    (55, 'service'), 
    (30, 'rd'), 
    (81, 'finance'), 
    (91, 'header'), 
    ) 

    Unit = models.ForeignKey(Units, on_delete = models.PROTECT) 
    name = models.CharField(max_length = 20) 
    rights = models.CharField(max_length = 1000, default = '0') 
    assign = models.CharField(max_length = 1000, default = '0') 
    type = models.IntegerField(choices = CHOICES_TYPE) 
    parent = models.ForeignKey('self', related_name = '+', blank = True, null = True, on_delete = models.PROTECT) 
    depth = models.IntegerField(default = 0) 
    orders = models.IntegerField(default = 0) 
    lead = models.CharField(max_length = 100) 

    addtime = models.DateTimeField(auto_now_add = True) 
    adderip = models.IPAddressField(default = '0.0.0.0') 
    status = models.IntegerField(choices = utils.CHOICES_STATUS, default = 200) 

    class Meta: 
    db_table = 'departs' 

tracetrack: 类型错误在/销售/收款/ generic_form_create_views/

list indices must be integers, not str 

Request Method:  GET 
Request URL: http://127.0.0.1:8000/sales/receivables/generic_form_create_views/ 
Django Version:  1.5.1 
Exception Type:  TypeError 
Exception Value:  

list indices must be integers, not str 

Exception Location:  D:/ERP\apps\sales\receivables\views.py in get, line 88 
Python Executable: D:\Python27\python.exe 
Python Version:  2.7.3 
Python Path:  

['D:/ERP', 
'D:\\Program Files (x86)\\JetBrains\\PyCharm 3.0\\helpers\\pydev', 
'D:\\Python27\\lib\\site-packages\\setuptools-2.0-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\python_dateutil-2.2-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\six-1.4.1-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\python_memcached-1.53-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\django_ckeditor_updated-4.2.6-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\django_ckeditorfiles-1.1-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\pip-1.5.1-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\jinja2-2.7.2-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\markupsafe-0.18-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\sphinx-1.2.2-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg', 
'D:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg', 
'D:\\erp4\xb1\xb8\xb7\xdd', 
'D:\\ERP', 
'C:\\Windows\\system32\\python27.zip', 
'D:\\Python27\\DLLs', 
'D:\\Python27\\lib', 
'D:\\Python27\\lib\\plat-win', 
'D:\\Python27\\lib\\lib-tk', 
'D:\\Python27', 
'D:\\Python27\\lib\\site-packages', 
'D:\\Python27\\lib\\site-packages\\PIL'] 
+0

你能告诉我们DepartsForm的代码吗? – cor

+0

你能展示确切的回溯,谢谢。 – ruddra

回答

1

在你DepartFormCreateView鉴于您已经定义fields的列表作为

fields = ['depth', 'orders', 'lead', 'name','type','Unit','parent'] 

,并在get()方法,你正在尝试做的

self.fields['Unit'].queryset = ... 

在这里,您正在访问使用字符串'Unit'为指标,列表元素这在Python中无效。

我想你可能需要使用self.form.fields

self.form.fields['Unit'].queryset = .... 
0

感谢罗汉,你的回答对我很有帮助,并在几个小时的调试后,我终于找到解决方案。这里是。

def get(self, request, *args, **kwargs): 
     #form_class = self.get_form_class() 
     #form = self.get_form(form_class) 
     #form.fields['Unit'].queryset = Units.objects.filter(status = 200, parent__id = 2) 
     formview = super(DepartFormCreateView, self).get(request, *args, **kwargs) 
     formview.context_data['form'].fields['Unit'].queryset = Units.objects.filter(status = 200, parent__id = 2) 
     return formview 

我需要做的是重置窗体的值之前,它会导致HTML。

相关问题