Как создать UpdateView CBV с отношениями
Я устал искать лучший способ для UpdateView с CBV. Я тестировал некоторые учебники, но всегда получал ошибку. Может кто-нибудь сможет мне помочь. У меня есть 2 модели. Account и UserProfile. Первая. Я регистрирую пользователя аккаунта вот так, и расширяю пользователя в модели UserProfile. Это успешно.
Мой вопрос в том, как обновить данные в этом поле?
authentication/models.py
class Account(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
full_name = models.CharField(max_length=150)
create_account = models.DateTimeField(default=timezone.now)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_reviewer = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['full_name']
def __str__(self):
return self.email
dashboard/models.py
class UserProfil(models.Model):
JENIS_KELAMIN_CHOICE = (
('Pria', 'Pria'),
('Wanita', 'Wanita' ),
)
#Profil
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,)
gelar_depan = models.CharField(max_length=11, blank=True, default="")
gelar_belakang = models.CharField(max_length=20, blank=True, default="")
nik = models.CharField(max_length=11, blank=True, unique=True, default="")
nidn = models.CharField(max_length=11, blank=True, unique=True, default="")
email_alternatif = models.EmailField(_('email address'), blank=True, default="")
jenis_kelamin = models.CharField(max_length=6, blank=True, default="", choices =JENIS_KELAMIN_CHOICE)
tempat_lahir = models.CharField(max_length=30, blank=True, unique=True, default="")
tanggal_lahir = models.DateField(null=True, blank=True)
nomor_handphone = models.CharField(max_length=13, blank=True)
alamat = models.CharField(max_length=255, blank=True, default="")
dashboard/forms.py
class UserProfilForm(ModelForm):
class Meta:
model = UserProfil
fields = '__all__'
widgets = {
'gelar_depan' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'gelarDepan', 'placeholder' : 'Gelar Depan'}),
'user' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'namaLengkap', 'placeholder' : 'Nama Lengkap'}),
'gelar_belakang' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'gelarBelakang', 'placeholder' : 'Gelar Belakang'}),
'nidn' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'nidn', 'placeholder' : 'Nomor Induk Dosen Nasional'}),
'nik' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'nik', 'placeholder' : 'Nomor Induk Karyawan'}),
'tempat_lahir' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'gelarBelakang', 'placeholder' : 'Tempat Lahir'}),
'tanggal_lahir' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'gelarBelakang', 'placeholder' : 'Tanggal Lahir', 'type' : 'date'}),
'nomor_handphone' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'nik', 'placeholder' : 'No Handphone'}),
'email_alternatif' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'emailAlternatif', 'placeholder' : 'Email Alternatif'}),
'alamat' : forms.TextInput({'class' : 'form-control form-control-user', 'id' : 'alamat', 'placeholder' : 'Alamat'}),
'jenis_kelamin' : forms.Select({'class' : 'form-control form-control-user', 'id' : 'jenisKelamin',}),
}
dashboard/views.py
class UserProfilUpdateView(LoginRequiredMixin, UpdateView):
model = UserProfil
form_class = UserProfilForm
template_name = 'dashboard/profil.html'
success_url = '/dashboard/profil'
def form_valid(self, form):
# form.instance.user = self.request.user
messages.success(self.request, 'Success Save Your Data!.')
print(self.request.user)
return super().form_valid(form)
Я получил ответ, мне нужно два класса в forms.py, и назвать Account и UserProfile Model.
dashboard/forms.py
class UserAccountUpdateForm(ModelForm):
class Meta:
model = Account
fields = ['full_name', 'email']
class UserProfilUpdateForm(ModelForm):
class Meta:
model = UserProfil
exclude = ['user']
dashboard/views.py
class UserProfilUpdateView(LoginRequiredMixin, TemplateView):
model = UserProfil
u_form = UserAccountUpdateForm
p_form = UserProfilUpdateForm
template_name = 'dashboard/profil.html'
success_url = reverse_lazy('dashboard/profil')
def post(self, request):
post_data = request.POST or None
u_form = UserAccountUpdateForm(post_data, instance=request.user)
p_form = UserProfilUpdateForm(post_data, instance=UserProfil.objects.get(user = request.user))
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
context = self.get_context_data( u_form = u_form , p_form = p_form)
return self.render_to_response(context)
def get(self, request, *args, **kwargs):
return self.post(request, *args, **kwargs)