2011-04-12 86 views
0

我有一個模型和一個模型來改變一些設置。該表格顯示的是正確的值,但是當我提交表單時,request.POST字典中缺少一個字段。Django表單缺少一個字段

模型:

class NodeSettings(models.Model): 
    nodetype = models.CharField(max_length=8, editable=False) 
    nodeserial = models.IntegerField(editable=False) 
    upper_limit = models.FloatField(null=True, blank=True, 
            help_text="Values above this limit will be of different color.") 
    graph_time = models.IntegerField(null=True, blank=True, 
            help_text="The `width' of the graph, in minutes.") 
    tick_time = models.IntegerField(null=True, blank=True, 
            help_text="Number of minutes between `ticks' in the graph.") 
    graph_height = models.IntegerField(null=True, blank=True, 
             help_text="The top value of the graphs Y-axis.") 

    class Meta: 
     unique_together = ("nodetype", "nodeserial") 

視圖類(我使用Django 1.3與基於類的視圖):

class EditNodeView(TemplateView): 
    template_name = 'live/editnode.html' 

    class NodeSettingsForm(forms.ModelForm): 
     class Meta: 
      model = NodeSettings 

    # Some stuff cut out 

    def post(self, request, *args, **kwargs): 
     nodetype = request.POST['nodetype'] 
     nodeserial = request.POST['nodeserial'] 

     # 'logger' is a Django logger instance defined in the settings 
     logger.debug('nodetype = %r' % nodetype) 
     logger.debug('nodeserial = %r' % nodeserial) 

     try: 
      instance = NodeSettings.objects.get(nodetype=nodetype, nodeserial=nodeserial) 
      logger.debug('have existing instance') 
     except NodeSettings.DoesNotExist: 
      instance = NodeSettings(nodetype=nodetype, nodeserial=nodeserial) 
      logger.debug('creating new instance') 

     logger.debug('instance.tick_time = %r' % instance.tick_time) 

     try: 
      logger.debug('POST[tick_time] = %r' % request.POST['tick_time']) 
     except Exception, e: 
      logger.debug('error: %r' % e) 

     form = EditNodeView.NodeSettingsForm(request.POST, instance=instance) 
     if form.is_valid(): 
      from django.http import HttpResponse 
      form.save() 
      return HttpResponse() 
     else: 
      return super(EditNodeView, self).get(request, *args, **kwargs) 

模板的相關部分:

<form action="{{ url }}edit_node/" method="POST"> 
    {% csrf_token %} 
    <table> 
    {{ form.as_table }} 
    </table> 
    <input type="submit" value="Ok" /> 
</form> 

下面是在控制檯調試輸出運行調試服務器時:

2011-04-12 16:18:05,972 DEBUG nodetype = u'V10' 
2011-04-12 16:18:05,972 DEBUG nodeserial = u'4711' 
2011-04-12 16:18:06,038 DEBUG have existing instance 
2011-04-12 16:18:06,038 DEBUG instance.tick_time = 5 
2011-04-12 16:18:06,039 DEBUG error: MultiValueDictKeyError("Key 'tick_time' not found in <QueryDict: {u'nodetype': [u'V10'], u'graph_time': [u'5'], u'upper_limit': [u''], u'nodeserial': [u'4711'], u'csrfmiddlewaretoken': [u'fb11c9660ed5f51bcf0fa39f71e01c92'], u'graph_height': [u'25']}>",) 

正如您所看到的,字段tick_time在requestDict中不存在於request.POST中。

應當指出的是,該領域是在網絡瀏覽器,並查看HTML源代碼時,它看起來就像在形式等領域。

任何人有什麼可以是錯誤的任何提示?

回答

1

由於您使用的是通用視圖,是不是最好延長ProcessFormView而不是TemplateView

編輯

我已經試過你的代碼TemplateView

class EditNodeView(TemplateView): 

你有get_context_data推的形式?

def get_context_data(self, **kwargs): 
    instance = NodeSettings.objects.get(pk=kwargs['node_id']) 
    form = EditNodeView.NodeSettingsForm(instance=instance) 
    context = super(EditNodeView, self).get_context_data(**kwargs) 
    context['form'] = form 
    return context 

編輯現有的對象,最好的辦法是通過主鍵搞定,我已經中urls.py如下:

url(r'^edit-node/(?P<node_id>\d+)/$', EditNodeView.as_view(), name='edit-node'), 

我通過主鍵獲取的情況下,可能需要做一些檢查如果不存在,就像投擲404一樣。

在您的模型中,您有nodetypenodeserialeditable=False,如果它們設置爲不可編輯,您將如何顯示或創建這些項目?我已將它們設置爲True用於測試目的。

在模板中,我已經改變了第一行:

<form action="" method="POST"> 

我知道,有很多的變化,但上面可以查看和編輯正確你的模型。您可以將nodetypenodeserial設置爲表單級別的只讀,以防止人們對其進行編輯。

+0

轉換爲使用而不是TemplateView FormView控件,但基本問題仍然是request.POST缺少「tick_time」字段。 – 2011-04-13 07:38:04

+0

查看編輯答案。 – 2011-04-13 15:11:01

+0

重點已經改變,所以暫時擱置,但我會在一兩週內仔細研究一下你的答案。 – 2011-04-14 10:55:57