Джанго формирует request.user - PullRequest
       5

Джанго формирует request.user

4 голосов
/ 20 августа 2010

I пользователи моей модели могут создавать винтовки, и эта винтовка, очевидно, связана с пользователем.

class Gun(ImageModel):
    user = models.ForeignKey(User)  
    ...  
    ...  
    ...

У меня есть другая модель, которая зависит от этого и должна использовать пользовательские винтовки, но когдаПользователь добавляет запись, которую я хочу показать только его винтовкам.

МТ модель выглядит следующим образом

class Trophies(ImageModel):  
    used_his = models.ForeignKey(Gun)

моя форма выглядит следующим образом

from django.forms import ModelForm
from django import forms
from models import Trophies
from gunsafe.models import Gun
from django.contrib.auth.models import User

class TrophiesForm(request.user, ModelForm):
    used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))

    def __init__(self, user, *args, **kwargs):
        super(TrophiesForm, self).__init__(*args, **kwargs)
        self.fields['used_his'].queryset = User.objects.filter(pk = user)

Мне было интереснокак я могу получить текущий зарегистрированный идентификатор пользователя вместо user__id=1

Вот представление.

def edit(request, trophy_id, template_name='trophies/edit.html'):
    trophy = Trophies.objects.get(pk=trophy_id)

    if request.method == 'POST':
        form = TrophiesForm(request.POST, request.FILES, instance=trophy)
        if form.is_valid():
            newform = form.save(commit=False)
            newform.user = request.user
            newform.save()  
            ...  
            ...

Ответы [ 2 ]

10 голосов
/ 20 августа 2010

Я думаю, что вы можете достичь этого, переопределив метод __init__() формы, передав экземпляр User и отфильтровав queryset, используя этого пользователя. Примерно так:

class TrophiesForm(ModelForm):
    used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))

    def __init__(self, user, *args, **kwargs):
        super(TrophiesForm, self).__init__(*args, **kwargs)
        self.fields['used_his'].queryset = User.objects.filter(pk = user.id)

По вашему мнению, вы можете передать соответствующий (в настоящее время вошедший в систему) экземпляр User.

def my_trophies(request, *args, **kwargs):
    user = request.user
    form = TrophiesForm(user)
    ... 
6 голосов
/ 07 августа 2014

Другой угол представления Маноя ...

использовать kwarg для передачи пользовательских данных, чтобы не связываться с сигнатурой метода, поскольку он ожидает request.POST в качестве первого аргумента.Лучшее соглашение будет следующим:

class TrophiesForm(ModelForm):
    def __init__(self, *args, **kwargs):
        #using kwargs
        user = kwargs.pop('user', None)
        super(TrophiesForm, self).__init__(*args, **kwargs)
        self.fields['used_his'].queryset = User.objects.filter(pk = user.id)

Теперь в вызове это более явно и следует лучшему соглашению о подписи

form = TrophiesForm(request.POST, request.FILES, user=request.user)

Вы также можете использовать экземпляр: (обратите внимание насупер, прежде чем вы получите экземпляр obj)

class TrophiesForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(SubmissionUploadForm, self).__init__(*args, **kwargs)
        user = self.instance.user
        self.fields['used_his'].queryset = User.objects.filter(pk = user.id)

Затем вы можете вызвать ваш views.py так:

form = TrophiesForm(instance=*MyModel*(user=request.user))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...