Django Custom User update с моделью "один к одному" к модели Customer
Я пытаюсь создать представление Update для модели Customer, которая имеет отношение Onetoone с моделью User(django). После пяти часов попыток создания представлений на основе функций и классов мне не удается заставить это работать. Где я допускаю ошибку?
my models.py
class Customer(Model):
user = OneToOneField(User, on_delete=CASCADE)
mobile = CharField(max_length=12,null=True)
dob = DateField(null=True)
def __str__(self):
return self.user.username
my views.py
class ProfileUpdateView(UpdateView):
template_name = 'forms.html'
form_class = AdminUserUpdateForm
model = User
success_url = reverse_lazy('controls')
def get_object(self, queryset=None):
return Customer.objects.get(pk=self.kwargs['pk']).user
# Not working
def customer_list_view(request):
customer = Customer.objects.filter(user__groups__name='customer')
premium = Customer.objects.filter(user__groups__name='premium')
context = {'customer': customer, 'premium': premium}
return render(request, 'customercontrol.html', context)
my forms.py
class AdminUserUpdateForm(UserChangeForm):
class Meta:
model = User
fields = ['username', 'email', 'groups']
mobile = CharField(max_length=30)
dob = DateField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs['class'] = 'form-control'
@atomic
def save(self, commit=True):
user = super().save(commit)
mobile = self.cleaned_data['mobile']
dob = self.cleaned_data['dob']
customer = Customer.objects.get(user__pk=user.pk)
customer.mobile = mobile
customer.dob = dob
if commit:
customer.save()
return user
мои шаблоны, где я получаю PK для запросов.
тот, кто имеет форму
{% extends "base.html" %}
{% block content %}
<form method="post">
{% csrf_token %}
<table>{{ form }}</table>
<input type="submit" value="Submit" class="btn btn-primary">
</form>
{% endblock %}
urls.py
path('<int:pk>/groupupdate', GroupUpdateView.as_view(), name='groupdate'),
path('customercontrol', customer_list_view, name='customercontrol'),
Я нашел решение своей проблемы, мне нужно было добавить функцию в представление, которая передает начальные данные в форму:
def get_initial(self):
initial = super().get_initial()
initial['dob'] = Customer.objects.get(pk=self.kwargs['pk']).dob
initial['mobile'] = Customer.objects.get(pk=self.kwargs['pk']).mobile
return initial
