Обновление формы Django Admin ModelMultipleChoiceField не работает

#python #django #django-forms #django-admin #modelmultiplechoicefield

Вопрос:

Пока я создаю новую фирму, я могу добавлять пользователей без каких-либо ошибок. Но пока я пытаюсь обновить фирму, я выбрал по умолчанию пользователей, которые уже немощны, используя initial поле с (я не уверен, что это хороший метод). Я получаю эту ошибку

Выберите правильный выбор. 3 не является одним из доступных вариантов

Я думаю, что мой метод выбора по умолчанию не очень хорош.

Models.py

 class CustomUser(models.Model):

   username = models.CharField(max_length=20)
   ...<fields>....
   firm = models.ForeignKey(
             'Firm',
             null = True,
             blank = True,
             on_delete = models.Set_NULL,
             related_name = 'users'
          )

class Firm(models.Model):

   firm_name = models.CharField(max_length=20)
   .....<fields>.....
 

Forms.py

 class FirmAdminForm(forms.ModelForm):

    users = forms.ModelMultipleChoiceField(
                widget = FilteredSelectMultiple('username', is_stacked=False),
                queryset=User.objects.exclude(is_staff=True).filter(firm=None),
                required=False,
            )

    class Meta:
        model = Firm,
        fields = [...<other fields>, 'users']

    def save(self, commit=True):
        # Save the provided password in hashed format
        firm = super().save(commit=False)
        users = self.cleaned_data['users']
        firm.users.set(users)
        return firm
 

Admin.py

 class FirmAdmin(admin.ModelAdmin):

    form = FirmAdminform
    ...other codes .....


    def render_change_form(self, request, context, add, change, form_url, obj):
        users = SalesToolUser.objects.exclude(is_staff=True).filter(partner_firm=None)
        if obj:
            partner_agents = obj.users.all()
            users = User.objects.exclude(is_staff=True).filter(Q(firm=None)|Q(firm=obj)) 
            context['adminform'].form.fields['users'].initial = partner_agents

        context['adminform'].form.fields['users'].queryset = users
        return super().render_change_form(request, context, add=add, change=change, form_url=form_url, obj=obj)
 

Комментарии:

1. Я не понимаю, какова именно ваша модель пользователя? У вас есть CustomUser , User и SalesToolUser , похоже, вы используете все это взаимозаменяемо… Плюс я не понимаю необходимости делать этот фильтр, render_change_form разве вы уже не делаете это в форме?? Плюс установка этого начального значения, опять же, вам не нужно делать, чтобы форма обрабатывала начальные значения при обновлении экземпляра, поскольку это форма модели…