Найти - Пользователи
Полная версия: Текущий пользователь в формах
Начало » Django » Текущий пользователь в формах
1 2
infoforfoi
Объясните, пожалуйста, как определять текущего пользователя в формах.
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 выводился список данных относящихся только к данному пользователю
Спасибо
nnmware
если с 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))
infoforfoi
Спасибо, за то что направили
Почитал о 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)
Наверное есть вариант прям во вьюхе внедрить фильтр списка по пользователю?
В обход формы, но мне кажется это в логике не правильно.
Спасибо
nnmware
По-моему так
form = PhotoForm(user=request.user)
во вьюхе после else
lorien
можно проще на том уровне, где у вас видно request, создаёте форму и потом делаете
form = SomeForm()
form['estate'].queryset = SomeQueryset(..)
infoforfoi
Что-то я упускаю,
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)
но список упорно выдается полный
углубляюсь в изучение
nnmware
Не уверен, но может быть
form.fields['user'].queryset = Photos.objects.filter(user = request.user)
lorien
Ага, может быть, я вообще от балды написал, не проверял. Просто хочу обратить внимание на подход, вместо того, чтобы хакать формы, протаскивать через конструктор дополнительные объекты, бывает проще отредактирвоать форму извне.
infoforfoi
пробовал по разному… реагирует, но только на ошибки
логика уже примерно понятна, никак не получается правильно вписать что ли
если я правильно понимаю, делаю одно и тоже
в форме
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… не хотелось бы плодить то без чего можно обойтись
…но уже хоть как бы
nnmware
В этом случае не надо в форме делать, только во вьюхе
Ну наверное так тогда
form.fields['estate'] = forms.ModelChoiceField(Photos.objects.filter(estate__user__exact = request.user), required=False)
Хотя то что я кинул изначально- гарантированно для Class-based View работает. Хоть и хак, но вполне в духе Джанго.
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