2017-01-28 2 views
0

私はdjangoでウェブサイトを作ろうとしていて、選択リストを作成すると2つが現れます。Djangoは2つで、<select>を1つではなく、Bootstrap(フォームアップロード)を使用しようとしています

HTML:

<form action="/upload/" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
<div class="form-group"> 

    <select class="form-control"> 
     {% for course in form.courseChoices %} 
     <option value="{{course}}">{{course}}</option> 
     {% endfor %} 
    </select> 
    <!--div class="col-lg-6 col-sm-6 col-12" id="upload_form" --> 
     <label class="btn btn-block btn-primary"> 
      {{ form.document }} <input type="file" style="display: none; width: 100%;" > 
     </label> 
    </div> </form> 

これはhere

私のフォームは、カップルのフィールドを持つ単純なのModelFormであるように見えるされているものです。 forms.py class FileForm(forms.ModelForm): class Meta: model = FileUploads fields = ('semesterChoices', 'document', 'courseChoices',)

ここでは私のモデルは

class FileUploads(models.Model): 
semestersList = ['Spring 2017', 
       'Fall 2016', 
       'Spring 2016', 
       'Fall 2015', 
       'Spring 2015', 
       'Fall 2014', 
       'Spring 2014', 
       'Fall 2013'] 
with open('polls/courses.txt', 'r') as f: 
    coursesList = [line.strip() for line in f] 

semesters = [(option, option) for option in semestersList] 
courses = [(course, course) for course in coursesList] 
semesterChoices = models.CharField(max_length=20, choices=semesters, default="Spring 2017") 
courseChoices = models.CharField(max_length=20, choices=courses, default="ACCT Accounting") 
document = models.FileField(upload_to='documents/') 
uploaded_at = models.DateTimeField(auto_now_add=True) 

のように見えるものである私は、ブートストラップを選択したいが、それはどのような値がそれに渡されるようだと、本当にそれが取る、重要ではありません。 2番目のselect文を入力として使用します。

答えて

0

フォームクラスとテンプレートを調整する必要があります。

まず、フォームにcourseChoicesの選択入力があるようにするには、そのフォームで明示的に定義する必要があります。モデルにはCharFieldが含まれています。デフォルトでは、フォームにはCharFieldも用意されています。フォームは現在、そのうちの一つとの3つのフィールドがあり

from django import forms 

from .models import courses as course_choices 


FileForm(forms.ModelForm): 
    courseChoices = forms.ChoiceField(choices=course_choices) 

    class Meta: 
     model = FileUploads 
     fields = ('semesterChoices', 'document', 'courseChoices',) 

注意がそれに対応するモデルフィールドのデフォルトのフォームフィールドを使用する代わりに、CharFieldや他のChoiceFieldを使用するように上書きされています!学期の選択に別のChoiceFieldが必要な場合は、このフィールドで同じことを行う必要があります。

{# stuff before your form #} 

<form action="/upload/" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    <div class="form-group"> 
     {{ form.non_field_errors }}    

     {{ form.courseChoices.errors }} 
     <select name="{{ form.courseChoices.name }}" id="{{ form.courseChoices.id_for_label }}" class="form-control"> 
      {% for value, name in form.courseChoices.field.choices %} 
       <option value="{{ value }}">{{ name }}</option> 
      {% endfor %} 
     </select> 

     {{ form.document.errors }} 
     <label class="btn btn-default btn-file"> 
      <input type="file" style="display: none;" name={{ form.document.name }} id={{ form.document.id_for_label }}> 
     </label> 
    </div> 
</form> 

{# stuff after your form #} 

またmanually rendering form fieldsについてのドキュメントを参照してください。

は、その後、あなたのテンプレートに手動でこのようなあなたの<select>フィールドをレンダリングする必要があります。

ファイル入力がこのようなブートストラップで動作するかどうかわかりません。

{{form.as_p}}をテンプレートに追加するだけで、いつでも完全なフォームをレンダリングして、フォームがスタイル付けされていないように見えるようにすることができます。

あなたのモデルでは、実際にあなたが与えた選択肢の1つであるコースを一度に保存するだけなので、混乱を招くような、あなたのフィールドのcourseChoicesに名前を付けました。したがって、それをcourseChoicesと呼ぶのは意味がありません。代わりに、course_choicesとモデルフィールドのタプルを呼び出してください。

ちょっとしたメモ: Pythonの人々は、通常、ラクダのケースに賛成するスネークケースを好む。したがって、コーディングスタイルを変更する場合はcourseChoicesの代わりにcourse_choicesを使用してください。

+0

ありがとうございます!これは私のために働いた!私はDjangoのノブであり、これはDjangoがフォームフィールドをアンパックしていて、それを私が望むやり方にすることを理解してくれたので、手動でフィールドをレンダリングする必要がありました。 – NewbAndroider

関連する問題