Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:基于表单中的数据更新视图_Python_Html_Django - Fatal编程技术网

Python Django:基于表单中的数据更新视图

Python Django:基于表单中的数据更新视图,python,html,django,Python,Html,Django,我是django新手 我使用DetailView查看页面上的图表列表: class WidgetDetailView(FormMixin, DetailView): model = Widget template_name = 'board/detail.html' form_class = SelectForm period

我是django新手

我使用DetailView查看页面上的图表列表:

class WidgetDetailView(FormMixin, DetailView):                                                   

    model         = Widget
    template_name = 'board/detail.html'
    form_class    = SelectForm
    period        = 86400

    def get_success_url(self):
        return reverse('board:detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        context = super(WidgetDetailView, self).get_context_data(**kwargs)
        form_class = self.get_form_class()
        context['form'] = self.get_form(form_class)
        context['period'] = self.period
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
我有一个简单的表单和简单的选择:

class SelectForm(forms.Form):                     
    CHOICES = (                                   
        ('3600',     u'1 h'),                   
        ('7200',     u'2 h'),                  
        ('10800',    u'3 h'),                  
        ('21600',    u'6 h'),                 
        ('43200',    u'12 h'),                
        ('86400',    u'1 d'),                  
        ('604800',   u'1 w'),                
        ('1209600',  u'2 w'),                
        ('2592000',  u'1 m'),                 
        ('7776000',  u'3 m'),                
        ('15552000', u'6 m'),               
        ('31536000', u'1 y'),                     
    )                                             

    select = forms.ChoiceField(                   
        widget = forms.Select(                    
            attrs = {                             
                'class': 'form-control  input-sm',
                'onchange': 'this.form.submit();',
            }                                     
        ),                                        
        choices = CHOICES,                        
        label = u'Period'                        
    )
HTML代码:

{% extends 'board/base.html' %}                                                                                     
{% block content %}                                                                                                 
<div class="page-header">                                                                                       
    <h2>{{ widget.title }}</h2>                                                                                 
    <p>{{ widget.description }}</p>                                                                             
</div>
{% if widget.graph_set.all %}                                                                                   
<form method="post" action="." role="form" class="form-inline">                                                 
    {% csrf_token %}                                                                                            
    <label class="col-sm-1 control-label">Period</label>                                                       
    <div class="form-group">                                                                                    
    {{ form.select }}                                                                                           
    </div>                                                                                                      
</form>                                                                                                         
{% endif %}                                                                                                     

<div class="row">                                                                                               
{% for graph in widget.graph_set.all %}                                                                         
<div class="col-md-6">                                                                                          
    <h3>{{ graph.title }}</h3>                                                                                  
    <img src="https://zabbix.net.eximb.com/zabbix/chart2.php?graphid={{ graph.graph_id }}&width=400&height=200&period={{ period }}" alt="{{ graph.title }}">
    <p>{{ graph.description }}</p>
</div>
{% empty %}
<p>No graphs</p>
{% endfor %}
{% endblock %}

所以我想在从下拉列表中选择句点后重新加载页面。如何更新表单?提交后表单总是设置为默认值,并将{period}传递给模板?

我已将表单方法从POST更改为GET。现在,如果从列表中选择选项,表单将从GET请求中获取初始数据

此外,代码变得更加简单:

views.py:

detail.html:

class WidgetDetailView(DetailView):
    model         = Widget
    template_name = 'board/detail.html'

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs)                   
        return super(WidgetDetailView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(WidgetDetailView, self).get_context_data(**kwargs)
        context['form'] = SelectForm(initial=self.request.GET)
        context['period'] = self.request.GET.get('select', 86400)
        return context
...
<form method="get" action="." role="form" class="form-inline">
    <label class="col-sm-1 control-label">Масштаб</label>     
    <div class="form-group">                                  
    {{ form.select }}                                         
    </div>                                                    
 </form>
...