2014-11-04 95 views
3

我對django中的表單相當陌生。使用Django模板表單+表單嚮導+脆皮 - 不進行到第二步

我的問題是我有幾個非常大的模型,我必須分解成一系列更小的表單供用戶填寫。

因此,我一直在玩弄香脆的表單,昨天在YouTube上觀看Mike Hibberts教程(Python Django教程19 - 使用表單嚮導)後,我想看看我是否可以用脆皮形式進行這項工作。

一切似乎呈現OK給我,但是當我按下提交表單似乎被驗證,但不會繼續執行步驟2

我這樣做完全錯了?

感謝您的任何幫助或建議!


forms.py

from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit, Layout, ButtonHolder 
from crispy_forms.bootstrap import StrictButton 

from models import ProcessSheet 

class EnterData(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(EnterData, self).__init__(*args, **kwargs) 
     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'text-center col-lg-4' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout.append(Submit('save', 'save')) 
     """ 
     self.helper.layout = Layout(
      'sheet_id', 
      'sheet_title', 
      'part_name', 
      ButtonHolder('save', css_class='btn-warning'), 
     ) 
     # You can dynamically adjust your layout 
     """ 

    class Meta: 
     model = ProcessSheet 
     fields = "__all__" 

class Sheet1(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     print "sheet 1 init!!!!!!!!!!!!!!!" 
     super(Sheet1, self).__init__(*args, **kwargs) 
     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 
     self.helper.form_tag = False 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'text-center col-lg-4' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout = Layout(
      'sheet_id', 
      'sheet_title', 
      'part_name', 
     ) 

    class Meta: 
     model = ProcessSheet 
     fields = "__all__" 

class Sheet2(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(Sheet2, self).__init__(*args, **kwargs) 
     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 
     self.helper.form_tag = False 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'text-center col-lg-4' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout = Layout(
      'cooling', 
      'nozzle', 
      'zone_5', 
     ) 
    class Meta: 
     model = ProcessSheet 
     fields = "__all__" 

views.py

from django.shortcuts import render_to_response, RequestContext 
from process_forms.models import ProcessSheet 
from django.contrib.formtools.wizard.views import SessionWizardView 

import logging 
logr = logging.getLogger(__name__) 

from forms import EnterData 

# Create your views here. 
def SheetSelect(request): 
    logr.debug("IM IN SELECT!!!!!!!!!!!!") 
    print "IM IN SELECT!!!!!!!!!!!!" 
    form = EnterData(request.POST or None) 
    log_data_message = "Please Enter Some Data" 

    if form.is_valid(): 

     data = form.cleaned_data 

     if not ProcessSheet.objects.filter(sheet_id=data['sheet_id']): 

      save_it = form.save(commit=False) 
      save_it.save() 
      form = EnterData() 
      log_data_message = "Data Entered Ok!" 
     else: 
      log_data_message = "Sheet ID already exists!" 

    sheets = ProcessSheet.objects.all()  
    return render_to_response('PS14.html', 
           locals(), 
           context_instance=RequestContext(request)) 

def SheetFocus(request, sheet_id=0): 
    sheet = ProcessSheet.objects.get(id=sheet_id)  
    return render_to_response('PS24.html', 
           locals(), 
           context_instance=RequestContext(request)) 

class SheetWizard(SessionWizardView): 
    logr.debug("IM IN WIZARD!!!!!!!!!!!!") 
    template_name = "sheet_form.html" 

    def done(self, form_list, **kwargs): 
     logr.debug( "IM IN DONE!!!!!!!!!!!!") 
     form_data = process_form_data(form_list) 

     return render_to_response('done.html', {'form_data': form_data}) 

def process_form_data(form_list): 
    form_data = [form.cleaned_data for form in form_list] 
    logr.debug( "DONE PROCESS FORM DATA!!!!!!!!!!!!") 
    return form_data 

urls.py

from django.conf.urls import patterns, include, url 

from process_forms.forms import Sheet1, Sheet2 
from process_forms.views import SheetWizard 

urlpatterns = patterns('', 
    url(r'^all/', 'process_forms.views.SheetSelect'), 
    url(r'^get/(?P<sheet_id>\d+)/', 'process_forms.views.SheetFocus'), 
    url(r'^entry/', SheetWizard.as_view([Sheet1,Sheet2])), 
) 

models.py

from django.db import models 
from django.core.validators import MaxValueValidator, MinValueValidator 

# Create your models here. 
class ProcessSheet(models.Model): 

    ejector_confirmation_on = models.BooleanField(default=True) 

    number_of_cavities  = models.IntegerField(blank=True, null=True,validators=[ 
           MaxValueValidator(100), 
           MinValueValidator(1) 
          ]) 
    date     = models.IntegerField(blank=True, null=True) 
    shift     = models.IntegerField(blank=True, null=True,validators=[ 
           MaxValueValidator(4), 
           MinValueValidator(1) 
          ]) 

    sheet_desc    = models.TextField(blank=True, null=True) 
    comment     = models.TextField(blank=True, null=True) 

    sheet_id    = models.CharField(max_length=16, blank=False,null=True) 
    sheet_title    = models.CharField(max_length=24, blank=False,null=True) 
    part_number    = models.CharField(max_length=16, blank=False,null=True) 
    part_name    = models.CharField(max_length=16, blank=True, null=True) 
    machine_no    = models.CharField(max_length=16, blank=True, null=True) 
    special_notes   = models.CharField(max_length=256,blank=True, null=True) 
    end_of_arm_tool_number = models.CharField(max_length=16, blank=True, null=True) 
    program_picker_robot = models.CharField(max_length=16, blank=True, null=True) 
    nozzle_tip_size   = models.CharField(max_length=16, blank=True, null=True) 
    k_cut     = models.BooleanField(default=False) 
    hydraulic_unit_pressure = models.CharField(max_length=16, blank=True, null=True) 
    valve_gate    = models.CharField(max_length=16, blank=True, null=True) 
    colorant    = models.CharField(max_length=16, blank=True, null=True) 
    reasons_for_changes  = models.CharField(max_length=16, blank=True, null=True) 
    finger_print   = models.CharField(max_length=16, blank=True, null=True) 
    initial     = models.CharField(max_length=16, blank=True, null=True)  

    V1      = models.FloatField(blank=True, null=True) 
    V2      = models.FloatField(blank=True, null=True) 
    V3      = models.FloatField(blank=True, null=True) 
    V4      = models.FloatField(blank=True, null=True) 
    V5      = models.FloatField(blank=True, null=True) 
    position_pressure  = models.FloatField(blank=True, null=True) 
    pack_1     = models.FloatField(blank=True, null=True) 
    pack_2     = models.FloatField(blank=True, null=True) 
    pack1     = models.FloatField(blank=True, null=True) 
    pack2     = models.FloatField(blank=True, null=True) 
    shot_size    = models.FloatField(blank=True, null=True) 
    back_1     = models.FloatField(blank=True, null=True) 
    screw_speed    = models.FloatField(blank=True, null=True) 
    cushion_in_inches  = models.FloatField(blank=True, null=True) 
    injection_time   = models.FloatField(blank=True, null=True) 
    cycle_time    = models.FloatField(blank=True, null=True) 
    cooling     = models.FloatField(blank=True, null=True) 
    hot_sprue_1    = models.FloatField(blank=True, null=True) 
    nozzle     = models.FloatField(blank=True, null=True) 
    zone_1_barrel   = models.FloatField(blank=True, null=True) 
    zone_2_barrel   = models.FloatField(blank=True, null=True) 
    zone_3_barrel   = models.FloatField(blank=True, null=True) 
    mold     = models.FloatField(blank=True, null=True) 
    dryer     = models.FloatField(blank=True, null=True) 
    zone_1     = models.FloatField(blank=True, null=True) 
    zone_2     = models.FloatField(blank=True, null=True) 
    zone_3     = models.FloatField(blank=True, null=True) 
    zone_4     = models.FloatField(blank=True, null=True) 
    zone_5     = models.FloatField(blank=True, null=True) 
    zone_6     = models.FloatField(blank=True, null=True) 
    zone_7     = models.FloatField(blank=True, null=True) 
    zone_8     = models.FloatField(blank=True, null=True) 
    zone_9     = models.FloatField(blank=True, null=True) 
    zone_10     = models.FloatField(blank=True, null=True) 
    zone_11     = models.FloatField(blank=True, null=True) 
    zone_12     = models.FloatField(blank=True, null=True) 
    flowmeter_reading  = models.FloatField(blank=True, null=True) 

    def Meta(): 
     managed = True 

sheet_form.html

{% extends "base.html" %} 

{% block content %} 
<H1> This is the entry form </H1> 
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> 
<br> 

{{log_data_message}}   

<form action="/sheets/entry/" method="post"> 

{{ wizard.management_form }} 

{% load crispy_forms_tags %} 

{% crispy wizard.form %} 




{% if wizard.steps.prev %} 

<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">"first step"</button> 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">"prev step"</button> 
{% endif %} 

<input type="submit" value="Submit" /> 

</form> 

{% endblock %} 

{% block links %} 

{% for sheet in sheets %} 
    <a HREF="/sheets/get/{{ sheet.id }}">{{sheet.sheet_title}}</a> 
    <br> 
{% endfor %} 

{% endblock %} 

<br> 

有一個偉大的日子!

回答

0

我想我已經解決了一點問題,或者只是運氣好。

在forms.py其中所述元()字段=「__所有__」

需要被改變以反映感興趣的領域,我使用的可變Sheet1_layout和Sheet2_layout。之後,嚮導似乎繼續下一步。

forms.py

from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit, Layout, ButtonHolder 
from crispy_forms.bootstrap import StrictButton 

from models import ProcessSheet 

Sheet1_layout = (
    'sheet_id', 
    'sheet_title', 
    'part_name', 
    )   
class Sheet1(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 

     print "sheet 1 init!!!!!!!!!!!!!!!" 
     super(Sheet1, self).__init__(*args, **kwargs) 
     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 
     self.helper.form_tag = False 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'text-center col-lg-4' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout = Layout(Sheet1_layout, 
            ButtonHolder('save', css_class='btn-warning'), 
            ) 
     self.helper.layout.append(Submit('save', 'Save')) 
    class Meta: 
     model = ProcessSheet 
     fields = Sheet1_layout 


Sheet2_layout = (
    'cooling', 
    'nozzle', 
    'zone_5', 
    )   
class Sheet2(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(Sheet2, self).__init__(*args, **kwargs) 
     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 
     self.helper.form_tag = False 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'text-center col-lg-4' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout = Layout(Sheet2_layout, 
            ButtonHolder('finish', css_class='btn-warning'), 
            ) 
     self.helper.layout.append(Submit('save', 'Finish')) 
    class Meta: 
     model = ProcessSheet 
     fields = Sheet2_layout 

class TestSheet1(forms.Form): 
    sheet_id = forms.CharField(max_length=16) 

class TestSheet2(forms.Form): 
    hello = forms.CharField(max_length=16) 
1

爲了在以後任何人,我認爲香港專業教育學院解決了我的問題。 花了一點時間讓我弄清楚,但我堅持不懈的修補工作得到了回報。 對不起,我沒有詳細介紹我必須改變的內容,但我確定你們大多數人可以看到我發佈的代碼發生的變化。形式看起來很棒!會話嚮導按預期工作!似乎都好。祝大家好運!

類源於forms.py

class Sheet1(forms.ModelForm): 
def __init__(self, *args, **kwargs): 
    super(Sheet1, self).__init__(*args, **kwargs) 
    self.fields['machine_no'] = forms.ChoiceField(choices=get_site_choices()) 
    self.helper = FormHelper(self) 
    self.helper.form_tag = False 
    #self.helper.label_class = 'text-center col-lg-4' 
    #self.helper.field_class = 'col-lg-8' 
    self.helper.layout = Layout(
     HTML("{% include \"progress_bar_min.html\" with value=\"1\" %}"), 
     HTML("{% include \"form_head_information.html\" with value=\""+str(args)+"\" %}"), 
     TabHolder(
      Tab(
       'Sheet Information', 
        PrependedText('sheet_id', 'Django-'), 
        Alert(content='<strong>Automatically Generated ID!</strong> Just so you know.', css_class="alert-warning alert-dismissible"), 
        'sheet_title', 
        'part_name', 
       ), 
      Tab(
       'Press Location', 
        'machine_no', 
        'sheet_desc', 
       ), 
      Tab(
       'Comments', 
        Alert(content='<strong>Help Us Improve!</strong> Please leave lots of comments.', css_class="alert-info alert-dismissible"), 
        'comment', 
       ), 
     ), 
     ButtonHolder(
      Submit('Save', 'Save', css_class='btn-info'), 
      Submit('wizard_goto_step', '0'), 
      Submit('wizard_goto_step', '1'), 
      Submit('wizard_goto_step', '2'), 
     ), 
    ) 
    query = ProcessSheet.objects.latest('id').sheet_id 
    self.fields['sheet_id'].widget.attrs['readonly'] = True 
    self.fields['sheet_id'].initial = query+'-'+str(time.time()) 
    self.fields['sheet_id'].label = "ID For This Sheet" 
    self.fields['sheet_title'].label = "Enter A Title For This Sheet" 
    self.fields['part_name'].label = "Enter The Part Number" 
class Meta: 
    model = ProcessSheet 
    fields =(
     'sheet_id', 
     'sheet_title', 
     'part_name', 
     'machine_no', 
     'comment', 
     'sheet_desc', 
      ) 

sheet_form。html

{% extends "base.html" %} 

{% block content %} 
<H1> This is the entry form {{views_context_var}}</H1> 
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> 
<br> 

<form action="/sheets/entry/" method="post"> 
{{ wizard.management_form }} 

{% load crispy_forms_tags %} 

{% crispy wizard.form %} 

</form> 

{% endblock %} 

<br> 
+0

還沒完全實現完整的實現,但我以此爲例。我會評論我在答案中找到的內容。謝謝你寫這個。 – Axwack 2016-06-21 17:34:44

+0

你有沒有改變任何表2或你是否只是使用表1作爲例子? TestSheet1和TestSheet2發生了什麼?是否因爲你有你的ModelForm? – Axwack 2016-06-21 18:27:39

+0

拿走了你的代碼,但按鈕不是動態的,但你讓它們變成靜態的。有理由嗎? – Axwack 2016-06-22 19:28:13