Изменение модели в CreateView в зависимости от пользователя в django

Я хочу изменять модель представления createview в зависимости от пользователя. Класс представления выглядит следующим образом:

class SubirCasoView(LoginRequiredMixin, CreateView):
    login_url = reverse_lazy('users_app:user-login')
    template_name = 'casos/crear-caso.html'
    success_url = reverse_lazy('casos_app:update-caso')

  def get_form_class(self):
    current_user = self.request.user
    if current_user.especialidad == 'Reumatología':
        self.form_class = CasoReumaForm
    else:
        self.form_class = CasoDermaForm
    
    return self.form_class
    
  def form_valid(self, form):
    """If the form is valid, save the associated model."""
    if 'borrador' == self.request.POST:
        publicar = False
        self.object = form.save()
        self.object.user = self.request.user
        '''for each in self.cleaned_data['images_description']:
            ImageDescriptionDerma.objects.create(file=each, caso=self.object)
        for each in self.cleaned_data['images_evolucion']:
            ImageEvolucionDerma.objects.create(file=each, caso=self.object)'''
    else:
        publicar = True
        self.object = form.save()
        self.object.user = self.request.user
        '''for each in self.cleaned_data['images_description']:
            ImageDescriptionDerma.objects.create(file=each, caso=self.object)
        for each in self.cleaned_data['images_evolucion']:
            ImageEvolucionDerma.objects.create(file=each, caso=self.object)'''
        
    return super().form_valid(form)

Я пытался сделать что-то похожее на функцию 'get_form_class', но с моделью. Я пытался сделать это с помощью функции 'get_object', но, похоже, ничего не получилось. Моя идея состоит в том, чтобы сделать что-то вроде:

def function_name(self):
        current_user = self.request.user
        if current_user.especialidad == 'Reumatología':
            self.model = CasoReuma
        else:
            self.model = CasoDerma
        
        return self.model

Для этого можно использовать метод init.

class SubirCasoView(LoginRequiredMixin, CreateView):
    model = None

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        current_user = self.request.user
        if current_user.especialidad == 'Reumatología':
            self.model = CasoReuma
        else:
            self.model = CasoDerma

В конце концов я нашел решение, используя модель на форме. Я выбрал разные формы в зависимости от пользователя, поэтому я изменил формы следующим образом:

class CasoReumaForm(forms.ModelForm):
"""CasoReumaForm definition."""

# TODO: Define form fields here

tipo = forms.ChoiceField(choices=TYPE_CASO_REUMA, widget=forms.RadioSelect, label='Tipo de caso')
title = forms.CharField(label='Título', required=True)
description = forms.CharField(widget=forms.Textarea, label='Texto', required=True)

diagnostico = forms.CharField(widget=forms.Textarea, label='Texto', required=True)
images_description = MultiImageField(min_num=1, max_num=3 )
images_evolucion = MultiImageField(min_num=1, max_num=2 )

evolucion = forms.CharField(widget=forms.Textarea, label='Texto', required=True)

conclusiones = forms.CharField(widget=forms.Textarea, label='Texto', required=True)

class Meta:
    model = CasoReuma
    fields = [
        'tipo',
        'title',
        'description',
        'diagnostico',
        'evolucion',
        'conclusiones',
        'slide',
    ]

def save(self, commit=True):
    instance = super(CasoReumaForm, self).save(commit)
    for each in self.cleaned_data['images_description']:
        ImageDescriptionReuma.objects.create(file=each, caso=instance)
    for each in self.cleaned_data['images_evolucion']:
        ImageEvolucionReuma.objects.create(file=each, caso=instance)

    return instance

class CasoDermaForm(forms.ModelForm):
"""CasoDermaForm definition."""

# TODO: Define form fields here

tipo = forms.ChoiceField(choices=TYPE_CASO_DERMA, widget=forms.RadioSelect, label='Tipo de caso')
title = forms.CharField(label='Título', required=True)
description = forms.CharField(widget=forms.Textarea, label='Texto', required=True)
images_description = MultiImageField(min_num=1, max_num=3 )
images_evolucion = MultiImageField(min_num=1, max_num=2 )
diagnostico = forms.CharField(widget=forms.Textarea, label='Texto', required=True)
evolucion = forms.CharField(widget=forms.Textarea, label='Texto', required=True)
conclusiones = forms.CharField(widget=forms.Textarea, label='Texto', required=True)


class Meta:
    model = CasoDerma
    fields = [
        'tipo',
        'title',
        'description',
        'diagnostico',
        'evolucion',
        'conclusiones',
        'slide',
    ]

def save(self, commit=True):
    instance = super(CasoDermaForm, self).save(commit)
    for each in self.cleaned_data['images_description']:
        ImageDescriptionDerma.objects.create(file=each, caso=instance)
    for each in self.cleaned_data['images_evolucion']:
        ImageEvolucionDerma.objects.create(file=each, caso=instance)

    return instance
Вернуться на верх