2014-03-07 4 views
2

У меня есть простой класс формы с единственной областью определен:Джанго форма as_table(), as_p() методы не работают

class LaunchForm(forms.Form): 

    file_name = forms.FileField(required=True, label='File to import') 

в моем шаблоне у меня есть:

<form action="" method="post"> 
    {{ form.file_name }} 
    <table> 
     {{ form.as_table }} 
    </table> 
    {% csrf_token %} 
    <input type="submit" value="Submit"> 
</form> 

Форма в настоящее время вызывается с точки зрения следующим образом:

class Application_Launch_View(View): 

    form_class = LaunchForm 
    template_name = 'application_launch.html' 

    def get(self, request, app_id): 
     form = self.form_class(application_id=app_id) 
     return render(request, self.template_name, {'form': form}) 

Я ставлю переменную {{}} form.file_name в шаблон, чтобы убедиться, что поле формы существует. Что появляется на странице в браузере (наряду со всеми другими вещами в шаблоне) составляет:

<django.forms.fields.FileField object at 0x032A08F0> 

Но, кажется, не form.as_table быть приносит ничего.

Я пытался выдавать следующие вызовы функций сразу после создания экземпляра формы, на мой взгляд, как раз перед вызовом функции визуализации():

печати (form.file_name) печати (form.as_table())

в журнале отображается сервер:

<django.forms.fields.FileField object at 0x032A08F0> 

Вслед за пробелом. Если я удалю вызов as_table(), пустое пространство НЕ появится. Я попытался заменить form.as_p() в представлении, но получить те же результаты, поэтому, похоже, оба метода, по крайней мере, выводят пару CR или CR/FL.

Похоже, что все работает, кроме as_table() и as_p() методы, и я не могу понять, почему ...

++++++++++ +++++++++

Изучая это немного глубже, я заметил, что другая форма, ссылаясь на объект поля Django на форме изнутри шаблона, не дает описания класса объекта как I выше, но ожидаемое поле формы.

Так что я должен спросить, в чем разница между двумя методами ниже для установки поля формы и существует ли способ сделать второй метод (в пределах __init__())?

Метод 1 (это работает):

class LaunchForm: 

    file_name = forms.FileField(required=True, 
         label='File to import', 
         initial='Default value') 

Метод 2 (это не работает):

class LaunchForm: 

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

     self.file_name = forms.FileField(required=True, 
         label='File to import', 
         initial='Default value') 

ответ

2

Вы, кажется, проходит сам класс формы, а не экземпляр это, к шаблону. Вы должны сделать что-то вроде этого:

form = LaunchForm() 
return render(request, 'my_template.html', {'form': form}) 

и т. Д.

Редактировать

Чтобы добавить поле динамически внутри __init__, вы должны назначить его self.fields словаря:

self.fields['file_name'] = forms.FileField(...) 
+0

Возможно, я должен был включить мой код вида - извините. Отредактировано, чтобы добавить это. Ваше предложение заставило меня вернуться и проверить, но да, я передаю экземпляр, а не класс. –

+0

Вы дали мне понять, что здесь может быть не так, @ DanielRoseman. См. Мое дополнение выше. - –

3

Когда есть FileField, вам необходимо добавить к форме enctype для отправки файлов:

<form action="" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.file_name }} 
    <table> 
     {{ form.as_table }} 
    </table> 
    <input type="submit" value="Submit"> 
</form> 

См. документацию

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