Форум сайта python.su
Объясните, пожалуйста, как определять текущего пользователя в формах.
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
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))
Офлайн
если с 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))
Офлайн
Спасибо, за то что направили
Почитал о 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))
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)
Офлайн
По-моему так
form = PhotoForm(user=request.user)
во вьюхе после else
Офлайн
можно проще на том уровне, где у вас видно request, создаёте форму и потом делаете
form = SomeForm()
form['estate'].queryset = SomeQueryset(..)
Офлайн
Что-то я упускаю,
views.py
if request.method == 'POST': form = PhotoForm(request.POST, request.FILES) form['estate'].queryset = Photos.objects.filter(estate__user__exact = request.user)
if request.method == 'POST': form = PhotoForm(request.POST, request.FILES) form['user'].queryset = Photos.objects.filter(user = request.user)
Офлайн
Не уверен, но может быть
form.fields['user'].queryset = Photos.objects.filter(user = request.user)
Офлайн
Ага, может быть, я вообще от балды написал, не проверял. Просто хочу обратить внимание на подход, вместо того, чтобы хакать формы, протаскивать через конструктор дополнительные объекты, бывает проще отредактирвоать форму извне.
Офлайн
пробовал по разному… реагирует, но только на ошибки
логика уже примерно понятна, никак не получается правильно вписать что ли
если я правильно понимаю, делаю одно и тоже
в форме
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)
Отредактировано infoforfoi (Март 23, 2013 14:52:59)
Офлайн
В этом случае не надо в форме делать, только во вьюхе
Ну наверное так тогда
form.fields['estate'] = forms.ModelChoiceField(Photos.objects.filter(estate__user__exact = request.user), required=False)
Офлайн