【问题标题】:Django: update view based on the data from the formDjango:根据表单中的数据更新视图
【发布时间】:2014-09-16 12:38:32
【问题描述】:

我是 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 }} 传递给模板?

【问题讨论】:

    标签: python html django


    【解决方案1】:

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

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

    views.py

    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
    

    detail.html

    ...
    <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>
    ...                                                      
    

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 2012-12-09
      • 2019-04-22
      • 2012-09-29
      • 1970-01-01
      • 2019-03-05
      • 2015-07-15
      • 2015-07-19
      • 1970-01-01
      相关资源
      最近更新 更多