Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как вставить в поле формы текущего поль-ля при ModelForm и CreateView [RSS Feed]

#1 Авг. 6, 2012 01:30:09

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

Есть страничка , где надо дать возможность авторизованному пользователю создать новость.
Форму сделал с помощью ModelForm. В поле формы нужно вставить имя текущего пользователя, как это сделать? Читал, что нужно вынуть из request.user.username, но как воткнуть это в класс не разобрался.
place/views.py:

class PlaceNewsCreate(CreateView):
    form_class = PlaceNewsForm
    model = NewsItem
    template_name = 'place/create_place_news.html'

place/urls.py:
urlpatterns = patterns('place.views',
     url(r'^createNews/$', PlaceNewsCreate.as_view()),
)

news/models.py:
class NewsItem(WithAuthors, WithPublished):
    """NewsItem class"""
    title = models.CharField(_('title'), max_length=250)
    slug = models.SlugField(unique=True)
    short_text = models.CharField(_('short_text'), max_length=500)
    full_text = models.TextField(_('full text'))
    image = models.ImageField(_('image'), upload_to="uploads/news/%Y/%m", null=True, blank=True)
    is_fixed = models.BooleanField(_('is fixed'), default=False)
    objects = NewsItemManager()
    class Meta:
        verbose_name = _('NewsItem')
        verbose_name_plural = _('News')
    def __unicode__(self):
        return self.title

local/models.py:
class WithAuthors(models.Model):
     user = models.ForeignKey('auth.User', null=True, blank=True, verbose_name=_('user'))

Отредактировано buddha (Авг. 6, 2012 01:34:18)

Офлайн

#2 Авг. 6, 2012 03:18:10

adw0rd
От: Санкт-Петербург
Зарегистрирован: 2012-07-28
Сообщения: 107
Репутация: +  8  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

Добавьте в "PlaceNewsCreate" метод "get_initial":

def get_initial(self):
    return {'username': self.request.user.username}




Python, Django, Flask, Git, Emacs, Nginx, MySQL, SphinxSearch, Redis, Linux, FreeBSD
Мой блог, я на GitHub

Офлайн

#3 Авг. 6, 2012 09:29:00

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

adw0rd
Добавьте в “PlaceNewsCreate” метод “get_initial”:

def get_initial(self):
return {'username': self.request.user.username}
На основе проб и ощибок получился рабочий вариант:
place/views.py
def get_initial(self):
        return {'user': self.request.user}

Спасибо.

Отредактировано buddha (Авг. 6, 2012 09:32:47)

Офлайн

#4 Авг. 6, 2012 15:18:25

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

initial для формы используется только при отображении. Если при сохранении модели NewsItem в поле user вам нужно положить именно текущего пользователя, то так работать не будет. Точнее в форму может прилететь и другой пользователь, не текущий. Поправьте если я ошибаюсь.



Офлайн

#5 Авг. 6, 2012 16:23:39

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

Верно! В чем тут нюанс? почему не будет работать? что предлагаете?
Если можно, ссылочку на оф. документацию. Перечитаю внимательнее…

Отредактировано buddha (Авг. 6, 2012 16:27:22)

Офлайн

#6 Авг. 6, 2012 20:00:32

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

These values are only displayed for unbound forms, and they're not used as fallback values if a particular value isn't provided.
https://docs.djangoproject.com/en/1.4/ref/forms/api/#dynamic-initial-values

Как одно из решений: убрать поле user из формы, переопределить метод form_valid у view на примерно такой
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
...
Что там по умолчанию смотрите исходники django.views.generic.edit.ModelFormMixin



Отредактировано svas (Авг. 6, 2012 20:01:33)

Офлайн

#7 Авг. 7, 2012 22:49:57

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

Сделал так:
place/views.py

class PlaceNewsCreate(CreateView):
    form_class = PlaceNewsForm
    model = NewsItem
    template_name = 'place/create_place_news.html'
    success_url = 'http://127.0.0.1:8000/places/raznye/1/'
    def form_valid(self, PlaceNewsForm):
        self.object = PlaceNewsForm.save(commit=False)
        self.object.user = self.request.user
        self.object.slug = pytils.translit.slugify(self.object.title)
        self.object.save()

теперь на редирект ругается, хотя success_url указал конкретный и существующий…
Request Method: 	POST
Request URL: 	http://127.0.0.1:8000/places/createNews/
Django Version: 	1.4
Exception Type: 	ValueError
Exception Value: 	
The view place.views.PlaceNewsCreate didn't return an HttpResponse object.
Exception Location: 	/home/gnom/moms/.env/local/lib/python2.7/site-packages/django/core/handlers/base.py in get_response, line 129
Python Executable: 	/home/gnom/moms/.env/bin/python

Офлайн

#8 Авг. 8, 2012 00:28:43

adw0rd
От: Санкт-Петербург
Зарегистрирован: 2012-07-28
Сообщения: 107
Репутация: +  8  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

В конце тела метода "form_valid" вставьте:

return super(PlaceNewsCreate, self).form_valid(PlaceNewsForm)




Python, Django, Flask, Git, Emacs, Nginx, MySQL, SphinxSearch, Redis, Linux, FreeBSD
Мой блог, я на GitHub

Отредактировано adw0rd (Авг. 8, 2012 00:29:01)

Офлайн

#9 Авг. 8, 2012 00:30:04

adw0rd
От: Санкт-Петербург
Зарегистрирован: 2012-07-28
Сообщения: 107
Репутация: +  8  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

А это:

self.object.slug = pytils.translit.slugify(self.object.title)

надо делать в модели




Python, Django, Flask, Git, Emacs, Nginx, MySQL, SphinxSearch, Redis, Linux, FreeBSD
Мой блог, я на GitHub

Офлайн

#10 Авг. 16, 2012 09:40:36

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Как вставить в поле формы текущего поль-ля при ModelForm и CreateView

А вот такой вариант?

class MyView(CreateView):
    form_class = MyForm
    def get_form_kwargs(self):
        kwargs = super(MyView, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs

————–
в форме -
def MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(MyForm, self).__init__(*args, **kwargs)
        # и тут можно на основании переданного юзера смастерить поле или что-нибудь сделать
        if not user.is_authenticated():
            self.fields['recaptcha'] = ReCaptchaField(error_messages = { 'required': _('This field is required'),
                                                                       'invalid' : _('Answer is wrong') })

Отредактировано nnmware (Авг. 16, 2012 10:16:39)

Офлайн

  • Начало
  • » Django
  • » Как вставить в поле формы текущего поль-ля при ModelForm и CreateView[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version