воскресенье, 22 апреля 2012 г.

Django. Настойка FileField у Модели. Вывод модели в форму.

Работаю с django совсем недавно. но уже успел полюбить его. Чего стоит только модуль работы с формами. Покажу его работу на примере простой модели:


class UserProfile(models.Model):
    login = models.CharField(max_length = 255, verbose_name=u'Логин')
    password = models.CharField(max_length = 255, verbose_name=u'Пароль')
    photo = models.ImageField(upload_to='profiles', verbose_name=u'Фото')

Создали модель с тремя полями. Обратите внимание, что третье поле- это поле для загрузки фотографии. Имеет один обязательный атрибут "upload_to"(и еще несколько необязательных, их смотрите в офф. документации). В нем указываете папку, в которую грузить файлы/изображения. Сама папка должна находится в вашем MEDIA_ROOT, указанном в settings.py. Теперь нам нужно создать под это дело форму. Тут то и проявляется вся прелесть django. Если у нас есть модель, нам не надо описывать каждое поле, а просто укажем нужную нам модель и форма сгенерируется сама. Вот содержимое forms.py:
from django import forms #сам модуль
from project.app.models import * #импортируем модели

class UserForm(forms.ModelForm):
    class Meta:
        model = UserProfile #указываем модель из которой генерируем форму
Далее создаем функцию в views.py
def user_add(request):
    if request.method == 'POST':
        form = UserForm(request.POST, request.FILES) # не забываем, что нам нужно еще и файл сохранить
     
        if form.is_valid():
            form.save() # сохраняем модель в БД
        else:
            form = UserForm(request.POST, request.FILES)
    else:
        form = UserForm
    return render_to_response('file_form.html', locals(), context_instance=RequestContext(request)) #указываем шаблон
ВСЁ! В шаблоне достаточно прописать
<form method="POST" action=""  enctype="multipart/form-data">{% csrf_token %}
<table>
{{ form }}

</table>
<input type="submit" value="Отправить" />
</form>
и получим нашу форму для заполнения полей.

27 комментариев:

  1. почему форма может не подтягиваться в шаблоне?

    ОтветитьУдалить
    Ответы
    1. Как шаблон генерируешь? Какой контекст передаешь в него?

      Удалить
  2. полностью скопипастил, а выводится ток кнопка отправить, а формы нет

    ОтветитьУдалить
    Ответы
    1. Вот здесь архив с этим примером. У себя только что проверил, все работает.

      Удалить
    2. спасибо за пример!!

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. а выгрузку файлов ты не реализовывал?

    ОтветитьУдалить
    Ответы
    1. Всмысле "выгрузку"? Откуда выгружать?)

      Удалить
    2. я хочу на странице загружать и выгружать файлы..Мои задумки:будет грид с таблицей где будет высвечиваться например таблица Userprofiles.внизу кнопка добавить пользователя и не знаю может еще кнопка выгрузить фотографию пользователя где в поле буду указывать id его или обработать щелчок мышки по гриду чтобы скачать именно что нужно..Подскажи как реализовать легче?может есть примеры..

      Удалить
    3. Выгрузка - это, как я понял, скачивание, так? Ну делаешь таблицу, задаешь нужный стиль и выводишь в шаблоне всех пользователей через шаблонный тег {% for %}

      Удалить
    4. нет я хочу с сайта скачать фотографии пользователей..через шаблонный тег {% for %} я же просто выведу данные в таблицу на страницу..или я недопонимаю что-то?

      Удалить
    5. Ну выводишь таблицу вида:
      <table>
      {% for u in users %}
      <tr><td>{{ u.login }}</td><td><a href="{{ u.photo.url }}">Скачать фото</a></td></tr>
      {% endfor %}
      </table>

      Удалить
    6. Где users - это пользователи из базы.

      Удалить
  5. а примера нет тестового?

    ОтветитьУдалить
    Ответы
    1. Нет. Дополни тот, что я заливал :) Это не трудно.

      Удалить
  6. но эта ссылка получается нерабочей..
    The current URL http://127.0.0.1:8000/files/ss.doc
    didn't match any of these.

    ОтветитьУдалить
  7. нет..нужно еще что-то прописать в setting.py

    ОтветитьУдалить
    Ответы
    1. Ага. Почитай в официальной документации на djbook.ru про это :) Там все подробно расписано. Вот тут я ответил что в urls.py прописывать

      Удалить
  8. все получилось...а в dojo grid ты не выводил данные из таблиц?

    ОтветитьУдалить
    Ответы
    1. Не, я с dojo вообще не знаком. Пользуюсь jQuery, пока хватает :) Еще, говорят, ExtJS клевый. Там тоже grid'ы есть.

      Удалить
  9. решил dojo опробовать...но с предыдущим получается что файл мы не скачиваем а открываем..или еще что то не дописал?

    ОтветитьУдалить
  10. хотя это проблема ток txt и html..

    ОтветитьУдалить
    Ответы
    1. Ну, это у тебя так браузер устроен :) Он по умолчанию открывает их. Запихай в zip архив, например.

      Удалить
  11. а активным пунктом меню на django ты не занимался?

    ОтветитьУдалить
    Ответы
    1. Делал. Но не совсем правильно. В каждом пункте меню писал что то вида {% if page == 1 %} class="active" {% endif %}
      Это работало, но не есть хорошо)

      Удалить