ОБНОВЛЕНИЕ: Dynami c MultipleChoiceField изменяет экземпляры на строки - PullRequest
0 голосов
/ 03 августа 2020

У меня есть форма django с полем множественного выбора. Поле должно быть динамическим c, то есть должны отображаться только записи, связанные с пользователем, который в настоящее время вошел в систему. Мне пока удалось собрать это вместе;

forms.py

class myForm(forms.ModelForm):

    def __init__(self, someUser, *args, **kwargs):
        super(myForm, self).__init__(*args, **kwargs)

        someRecords = models.SomeModel.objects.filter(someUser = someUser)
        #The line above gets records associated with a specific user

        displayNames = []
        for i in someRecords:
            displayNames.append((i.someField, i.someOtherField + ' ' + i.someOtherField2))
            #I am basically making a list of tuples, containing a field and a concatnation of two other fields. The latter will be what is displayed in the select box

        self.fields['theSelectField'] = forms.ChoiceField(choices = displayNames)

        class Meta:
            #I defined model, fields and labels here

views.py

def myFormPage(request):
    someUser = request.user.someextensionofuser.someUser
    form = forms.myForm(someUser)
    context = {'form': form}
    if request.method == 'POST':
        form = forms.myForm(someUser, data = request.POST)
        if form.is_valid():
            #Do Stuff if form is valid. However,this stuff doesn't get done, the page refreshes instead

Итак, мне удалось сделать выбор опции Dynami c. Однако теперь я не могу отправить данные.

EDIT: один из комментариев помог мне решить ранее указанную проблему. Я обновил код views.py. Однако теперь я сталкиваюсь с этой ошибкой;

Невозможно назначить «someString»: «someModel.someField» должен быть экземпляром «someForeignModel»

значения параметров кажутся строками, а не ссылками на объекты. Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Я выяснил. Поскольку моя основная проблема заключалась в том, как параметры отображаются для пользователя, я решил go с изменением моего метода str в models.py на;

class someModel(models.Model):
    #my fields

    def __str__(self):
        return self.someField + ' ' + self.someOtherField

Затем в моем forms.py, я выбрал ответ @dmoe;

self.fields['theSelectField'] = forms.ModelChoiceField(queryset = models.SomeModel.objects.filter(someUser = someUser))

Итак, теперь обе проблемы решены. Мои параметры имеют настраиваемые метки, и я могу отправить свои данные, не выполняя valueError.

0 голосов
/ 03 августа 2020

Это ограничивает возможные варианты вашего поля выбора:

self.fields['theSelectField'].queryset = SomeModel.objects.filter(someUser = someUser)

В ваших представлениях вы можете захотеть использовать представление на основе классов, потому что оно обрабатывает множество вещей автоматически и экономит ваше время. Взгляните сюда: https://ccbv.co.uk/

...