Изменение модели в 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