Форум сайта python.su
Есть страничка , где надо дать возможность авторизованному пользователю создать новость.
Форму сделал с помощью ModelForm. В поле формы нужно вставить имя текущего пользователя, как это сделать? Читал, что нужно вынуть из request.user.username, но как воткнуть это в класс не разобрался.
place/views.py:
class PlaceNewsCreate(CreateView): form_class = PlaceNewsForm model = NewsItem template_name = 'place/create_place_news.html'
urlpatterns = patterns('place.views', url(r'^createNews/$', PlaceNewsCreate.as_view()), )
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
class WithAuthors(models.Model): user = models.ForeignKey('auth.User', null=True, blank=True, verbose_name=_('user'))
Отредактировано buddha (Авг. 6, 2012 01:34:18)
Офлайн
Добавьте в "PlaceNewsCreate" метод "get_initial":
def get_initial(self):
return {'username': self.request.user.username}
Офлайн
adw0rdНа основе проб и ощибок получился рабочий вариант:
Добавьте в “PlaceNewsCreate” метод “get_initial”:
def get_initial(self):
return {'username': self.request.user.username}
def get_initial(self): return {'user': self.request.user}
Отредактировано buddha (Авг. 6, 2012 09:32:47)
Офлайн
initial для формы используется только при отображении. Если при сохранении модели NewsItem в поле user вам нужно положить именно текущего пользователя, то так работать не будет. Точнее в форму может прилететь и другой пользователь, не текущий. Поправьте если я ошибаюсь.
Офлайн
Верно! В чем тут нюанс? почему не будет работать? что предлагаете?
Если можно, ссылочку на оф. документацию. Перечитаю внимательнее…
Отредактировано buddha (Авг. 6, 2012 16:27:22)
Офлайн
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
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
...
Отредактировано svas (Авг. 6, 2012 20:01:33)
Офлайн
Сделал так:
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()
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
Офлайн
В конце тела метода "form_valid" вставьте:
return super(PlaceNewsCreate, self).form_valid(PlaceNewsForm)
Отредактировано adw0rd (Авг. 8, 2012 00:29:01)
Офлайн
А это:
self.object.slug = pytils.translit.slugify(self.object.title)
надо делать в модели
Офлайн
А вот такой вариант?
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)
Офлайн