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