2017-01-28 2 views
0

Итак, я пытаюсь создать сайт с django, и у меня возникает проблема, когда при создании списка выбора появляются два сообщения.Django делает два <select> вместо одного, пытаясь использовать 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) 

Я просто хочу бутстраповские выбрать, но мне кажется, что все, что значение передается в это действительно не имеет значения, он принимает второй оператор выбора в качестве входных данных.

ответ

0

Вы должны отрегулировать свой класс формы, а также ваш шаблон.

Прежде всего, если вы хотите, чтобы ваша форма имела выбор для вашего courseChoices, вы должны явно определить это в своей форме. Ваша модель просто содержит CharField, и по умолчанию ваша форма также предоставит только CharField.

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',) 

Обратите внимание, что ваша форма теперь имеет три поля с одним из них переопределяются использовать ChoiceField вместо CharField, а другой, используя поле формы по умолчанию для их соответствующей модели поля! Если вы хотите иметь еще один ChoiceField для своего выбора семестра, вы должны сделать то же самое с этим полем.

Затем в шаблоне, вы должны вручную сделать ваше <select> поле, как это:

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

Я не знаю, будет ли вход файла работать с бутстрапом, подобным этому.

Вы также можете произвести визуализацию полной формы путем добавления {{form.as_p}} к вашему шаблону, чтобы узнать, как ваша форма должна выглядеть некрашенной.

В вашей модели вы назвали свой курс CourseChoices, который немного запутан, потому что вы на самом деле сохраняете только один курс за раз в нем, что является одним из вариантов, которые вы ему дали. Поэтому нет смысла называть это CourseChoices. Вместо этого вы должны называть ваш кортеж вариантов course_choices и вашего поля модели только курс.

Небольшая заметка стороны: В питоне люди обычно предпочитают случай с змеей в пользу случая с верблюдом. Поэтому, если вы хотите адаптировать свой стиль кодирования, используйте course_choices вместо courseChoices.

+0

Спасибо! Это сработало для меня! Я ноб в Django, и это помогло мне понять, что Django распаковывал поля формы и делал это так, как я хотел, мне пришлось бы вручную отображать поля. – NewbAndroider

 Смежные вопросы

  • Нет связанных вопросов^_^