2017-04-30 18 views
0

我正在創建動態列表choicessymbol字段。我在視圖中創建了這個列表,然後把它放到構造函數中。爲什麼表單的內容有變化?

我想從Dictionary模態把它放在choices裏,並以我的形式顯示,但在同一時間我不需要顯示已存在於Requirement模式的數據。

在啓動它顯示的形式正確: enter image description here

然後,當我嘗試點擊提交按鈕形式更改爲:(怎麼啦一切發生的時候?) enter image description here

models.py:

class Dictionary(models.Model): 
    symbol = models.CharField(_('Symbol'), max_length=250) 
    name = models.CharField(_('Name'), max_length=250) 

class Requirement(models.Model): 
    project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    symbol = models.CharField(_('Symbol'), max_length=250) 
    name = models.CharField(_('Name'), max_length=250) 

forms.py:

class RequirementForm(forms.ModelForm): 
    symbol = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) 

    class Meta: 
     model = Requirement 
     fields = ('symbol',) 

    def __init__(self, final_list, *args, **kwargs): 
     super(RequirementForm, self).__init__(*args, **kwargs) 
     self.fields['symbol'].choices = [(x[0], x[1]) for x in final_list)] 

views.py:

def requirement_add(request, project_code): 
    data = dict() 
    project = get_object_or_404(Project, pk=project_code) 

    requirements = Requirement.objects.filter(project=project_code) 
    result = [] 
    for x in requirements: 
     v = (x.symbol, x.name) 
     result.append(v) 
    full_result = [(x.symbol, x.name) for x in Dictionary.objects.all()] 
    final_list= list(set(full_result)^set(result)) 

    if request.method == 'POST': 
     form = RequirementForm(request.POST, final_list) 
     if form.is_valid(): 
      requirement_dict = dict(((x.symbol, x.name) for x in Dictionary.objects.all())) 
      symbols = form.cleaned_data.get('symbol') 
      requirement = form.save(commit=False) 
      for symbol in symbols: 
       requirement.project = project 
       requirement.symbol = symbol 
       requirement.name = requirement_dict [symbol] 
       requirement.pk = None 
       requirement.save() 
      data['form_is_valid'] = True 
      requirements = Requirement.objects.filter(project=project_code) 
      context = {'project': project, 'requirement': requirement, 'requirements': requirements} 
      data['html_requirement'] = render_to_string('project/requirement_list.html', context) 
     else: 
      data['form_is_valid'] = False 
    else: 
     form = RequirementForm(final_list) 
    context = {'project': project, 'form': form} 
    data['html_requirement_form'] = render_to_string('project/requirement_add.html', context, request=request) 
    return JsonResponse(data) 

錯誤:

Traceback (most recent call last): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\reversion\revisions.py", line 296, in do_revision_context 
    return func(*args, **kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 616, in requirement_add 
    if form.is_valid(): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 169, in is_valid 
    return self.is_bound and not self.errors 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 161, in errors 
    self.full_clean() 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 370, in full_clean 
    self._clean_fields() 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 382, in _clean_fields 
    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\widgets.py", line 626, in value_from_datadict 
    return data.get(name) 
AttributeError: 'list' object has no attribute 'get' 
+0

其餘的視圖在哪裏?內容何時改變? –

+0

@DanielRoseman您好!我添加了我的觀點的完整代碼。檢查它請。正如我在我的帖子中所說的,我有一個表單,用戶可以選擇複選框,然後將數據添加到數據庫。在我看來,我創建了「choises」的動態列表,但當我單擊表單中的提交按鈕時,我遇到了問題。表單不添加數據到數據庫。它只是改變表單內容。我不明白我犯的錯誤?你有什麼想法?! –

+0

另外,正如我在我的文章中所說,我想從字典模式中的所有數據把它放在選項中,並在我的表單中顯示,但在同一時間,我不需要顯示已經存在於Requirement模式中的數據。我的動態列表起作用。但表單工作不正確。在發佈後,您可以看到單擊「提交」按鈕時表單的角色如何變化的圖片。 –

回答

0

最後我發現我的錯誤!它在這一行:

RequirementForm(data=request.POST, final_list=final_list) 
相關問題