Найти - Пользователи
Полная версия: Как вставить в поле формы текущего поль-ля при ModelForm и CreateView
Начало » Django » Как вставить в поле формы текущего поль-ля при ModelForm и CreateView
1
buddha
Есть страничка , где надо дать возможность авторизованному пользователю создать новость.
Форму сделал с помощью 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'))
adw0rd

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

def get_initial(self):
    return {'username': self.request.user.username}
buddha
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}

Спасибо.
svas
initial для формы используется только при отображении. Если при сохранении модели NewsItem в поле user вам нужно положить именно текущего пользователя, то так работать не будет. Точнее в форму может прилететь и другой пользователь, не текущий. Поправьте если я ошибаюсь.
buddha
Верно! В чем тут нюанс? почему не будет работать? что предлагаете?
Если можно, ссылочку на оф. документацию. Перечитаю внимательнее…
svas
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
buddha
Сделал так:
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
adw0rd

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

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

А это:

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

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

nnmware
А вот такой вариант?
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') })
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB