Ограничить выбор поля в зависимости от пользователя - PullRequest
4 голосов
/ 04 ноября 2010

Мне бы хотелось, чтобы в форме отображались только учетные записи текущего пользователя в ChoiceField.Я попытался сделать следующее, но это не работает.

Редактировать: Извините, я забыл упомянуть "if kwargs", который я добавил, потому что TransForm () не показывает никаких полей.Я думаю, что это неправильно, но я не знаю другого пути.

views.py:

def in(request, account): 
    if request.method == 'POST':
        form = TransForm(request.user, data=request.POST)
        if form.is_valid():
            ...

    else:
        form = TransForm()

    context = {
          'TranForm': form,
    }
    return render_to_response(
        'cashflow/in.html',
        context,
        context_instance = RequestContext(request),
)

forms.py:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __init__(self, *args, **kwargs):
        super(TransForm, self).__init__(*args, **kwargs)
        if kwargs:
            self.fields['account'].queryset = Account.objects.filter(user=args[0])

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Вам также нужно правильно инициализировать форму, когда запрос НЕ является последующим запросом:

if request.method == 'POST':
    form = TransForm(user=request.user, data=request.POST)
    if form.is_valid():
        ...

else:
    form = TransForm(user=request.user)
 ...

и, кроме того, я бы рекомендовал удалить новый аргумент при вызове конструктора суперкласса:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(TransForm, self).__init__(*args, **kwargs)
        self.fields['account'].queryset = Account.objects.filter(user=user)
1 голос
/ 04 ноября 2010

Попробуйте это в forms.py:

class TransForm(ModelForm):
    class Meta:
        model = Trans

    def __ini__(self, user, *args, **kwargs):
        super(TransForm, self).__init__(*args, **kwargs)    
        qs = Account.objects.filter(user=user)
        self.fields['account'] = ModelChoiceField(queryset=qs)

Я предполагаю, что вы импортировали формы как from django.forms import *.

Я не уверен, что именно является причиной вашей проблемы, но я подозреваю две вещи (вполне возможно, обе):

  1. Вы вызываете конструктор суперкласса с неожиданным аргументом (пользователь).
  2. Выбор в ModelChoiceField определяется при запуске конструктора поля, который выполняется как часть конструктора суперкласса, и в этом случае вы устанавливаете набор запросов после того, как факт не влияет на выбор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...