Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2013 16:32:14

infoforfoi
Зарегистрирован: 2013-01-20
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Текущий пользователь в формах

Объясните, пожалуйста, как определять текущего пользователя в формах.
models.py

class Photos(models.Model):
    photo = models.ImageField(u'Фото', upload_to='upload_estate')
    desc = models.CharField(u'Описание', max_length=128, blank=True, null=True)
    estate = models.ForeignKey(Estates, related_name='estate')
class Estates(models.Model):
    user = models.ForeignKey(User, verbose_name=u"пользователь", blank=True, null=True)
+стандартный User
forms.py
from django.contrib.auth.models import User
user= request.user # как определить текущего пользователя?
class PhotoForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super (PhotoForm, self).__init__(*args, **kwargs)
        self.fields['estate'].queryset = Photos.objects.filter(estate__user__exact=Estates.objects.get(user))

хочу, чтобы в select выводился список данных относящихся только к данному пользователю
Спасибо

Офлайн

#2 Март 19, 2013 19:13:19

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

Текущий пользователь в формах

если с class-based view работаете, то можно так
Для вьюхи mix-in написать.

class UserToFormMixin(object):
    def get_form_kwargs(self):
        kwargs = super(UserToFormMixin, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs
и базовую форму
class UserFromRequestForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(UserFromRequestForm, self).__init__(*args, **kwargs)
        self._user = user
Тогда для Вашего примера будет примерно такая вьюха
class PhotoChangeView(UserToFormMixin, UpdateView):
    model = Photos
    form_class = PhotoForm
    template_name = "photo/form.html"
    success_url = reverse_lazy('photo_ok')
и форма
class PhotoForm(UserFromRequestForm):
    class Meta:
        model = Photos
    def __init__(self, *args, **kwargs):
        super (PhotoForm, self).__init__(*args, **kwargs)
        self.fields['estate'].queryset = Photos.objects.filter(estate__user__exact=Estates.objects.get(self._user))

Офлайн

#3 Март 21, 2013 07:02:48

infoforfoi
Зарегистрирован: 2013-01-20
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Текущий пользователь в формах

Спасибо, за то что направили
Почитал о class-based view и миксинах… есть примерный образ, но пока текст не поддается пониманию. Подскажите еще
forms.py:

class UserFromRequestForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')  ########### 'pop(): dictionary is empty'  
####### тут не понятно, как из вьюхи должен передаться текущий пользователь?
        super(UserFromRequestForm, self).__init__(*args, **kwargs)
        self._user = user 
class PhotoForm(UserFromRequestForm):
    class Meta:
        model = Photos
    def __init__(self, *args, **kwargs):
        super (PhotoForm, self).__init__(*args, **kwargs)
        self.fields['estate'].queryset = Photos.objects.filter(estate__user__exact=Estates.objects.get(self._user)) 
views.py:
редактирование происходит в кабинете пользователя, чтобы упростить делаю прям в стандартном django-profiles
def profile_photo(request, form_class=None, success_url=None,
                   template_name='profiles/profile_photo.html',
                   extra_context=None):
    username = request.user.username
    user = get_object_or_404(User, username=username)
    try:
        profile_obj = request.user.get_profile()
    except ObjectDoesNotExist:
        return HttpResponseRedirect(reverse('profiles_create_profile'))
    if success_url is None:
        success_url = reverse('profiles_profile_detail',
                              kwargs={ 'username': request.user.username })
    if request.method == 'POST':
        form = PhotoForm(request.POST, request.FILES)
        form.estate = Photos.objects.filter(estate__user__exact = request.user)
        if form.is_valid():
            try:
                image = request.FILES['image']
            except:
                image = False 
            form.save()
            if image:
                filename, fileext = os.path.splitext(unicode(image.name))
                filename = str(random.random()).replace('.','')+fileext
                form.image.save(filename, image, True)
                form.save()
        return render_to_response(template_name, {
            'form': form,                 
            'flag': True,
            }, context_instance = RequestContext(request), )
    else:
        form = PhotoForm()
    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value
    
    return render_to_response(template_name, {'profile': profile_obj,
                                              'form': form,
                                              'thumb': Estates.objects.filter(user=user),
                                              }, context_instance=context)
Наверное есть вариант прям во вьюхе внедрить фильтр списка по пользователю?
В обход формы, но мне кажется это в логике не правильно.
Спасибо

Отредактировано infoforfoi (Март 21, 2013 07:03:34)

Офлайн

#4 Март 22, 2013 00:04:51

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

Текущий пользователь в формах

По-моему так
form = PhotoForm(user=request.user)
во вьюхе после else

Офлайн

#5 Март 22, 2013 21:56:52

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Текущий пользователь в формах

можно проще на том уровне, где у вас видно request, создаёте форму и потом делаете

form = SomeForm()
form['estate'].queryset = SomeQueryset(..)

Офлайн

#6 Март 23, 2013 07:52:48

infoforfoi
Зарегистрирован: 2013-01-20
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Текущий пользователь в формах

Что-то я упускаю,
views.py

if request.method == 'POST':
        form = PhotoForm(request.POST, request.FILES)
        form['estate'].queryset = Photos.objects.filter(estate__user__exact = request.user)
и создал поле user в модели Photos
if request.method == 'POST':
        form = PhotoForm(request.POST, request.FILES)
        form['user'].queryset = Photos.objects.filter(user = request.user)
но список упорно выдается полный
углубляюсь в изучение

Офлайн

#7 Март 23, 2013 11:02:17

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

Текущий пользователь в формах

Не уверен, но может быть

form.fields['user'].queryset = Photos.objects.filter(user = request.user)

Офлайн

#8 Март 23, 2013 11:58:56

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Текущий пользователь в формах

Ага, может быть, я вообще от балды написал, не проверял. Просто хочу обратить внимание на подход, вместо того, чтобы хакать формы, протаскивать через конструктор дополнительные объекты, бывает проще отредактирвоать форму извне.

Офлайн

#9 Март 23, 2013 14:52:31

infoforfoi
Зарегистрирован: 2013-01-20
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Текущий пользователь в формах

пробовал по разному… реагирует, но только на ошибки
логика уже примерно понятна, никак не получается правильно вписать что ли
если я правильно понимаю, делаю одно и тоже
в форме

self.fields['estate'].queryset = Photos.objects.filter(estate__user__exact=Estates.objects.get(self._user)) 
и вьюхе
form.fields['estate'].queryset = Photos.objects.filter(estate__user__exact = request.user)
пока никак

это если не делать поле user… не хотелось бы плодить то без чего можно обойтись
…но уже хоть как бы

Отредактировано infoforfoi (Март 23, 2013 14:52:59)

Офлайн

#10 Март 24, 2013 00:00:41

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

Текущий пользователь в формах

В этом случае не надо в форме делать, только во вьюхе
Ну наверное так тогда

form.fields['estate'] = forms.ModelChoiceField(Photos.objects.filter(estate__user__exact = request.user), required=False)
Хотя то что я кинул изначально- гарантированно для Class-based View работает. Хоть и хак, но вполне в духе Джанго.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version