Django формы: Как установить начальное значение поля, то значение, которое оно в данный момент содержит в базе данных
я хочу, чтобы пользователь мог видеть текущее значение поля, одновременно отправляя другое значение
forms.py:
class CustomerInfoForm(forms.Form):
first_name = forms.CharField(
label="Firstname",
widget=widgets.TextInput(),
required=False,
)
last_name = forms.CharField(
label="Lastname",
widget=widgets.TextInput(),
required=False,
)
views.py: (аутентификация по номеру телефона)
@login_required
def customer_panel_info_view(request):
info_form = CustomerInfoForm(request.POST or None)
if request.user.is_authenticated:
user_phone_number = request.user.phone_number
if info_form.is_valid():
first_name = info_form.cleaned_data.get("first_name")
last_name = info_form.cleaned_data.get("last_name")
customer = User.objects.get(phone_number=user_phone_number)
customer.first_name = first_name
customer.last_name = last_name
customer.save()
context = {
"info_form": info_form,
}
return render(request, "panel/info.html", context)
шаблон:
<form action="" method="post">
{% csrf_token %}
{% info_form %}
<button type="submit" class="btn btn-success">submit</button>
</form>
вот поток: пользователь заходит в эту форму и хочет добавить, изменить или удалить часть информации (это часть всего шаблона. фактически она содержит пол дату рождения и другие вещи). Я хочу, чтобы поля имели текущее значение, чтобы пользователь знал, какие поля уже имеют значение
Я рекомендую вам использовать класс ModelForm https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/
Что касается метода customer_panel_info_view, вы используете декоратор login_required, поэтому пользователь всегда аутентифицируется.
Если вы хотите избежать ModelForm
, вы можете добиться этого с помощью параметра initial
.
@login_required
def customer_panel_info_view(request):
initial = {"first_name": request.user.first_name, "last_name": request.user.last_name})
info_form = CustomerInfoForm(request.POST) if request.method == "POST" else CustomerInfoForm(initial=initial)
if info_form.is_valid():
first_name = info_form.cleaned_data.get("first_name")
last_name = info_form.cleaned_data.get("last_name")
request.user.first_name = first_name
request.user.last_name = last_name
request.user.save()
context = {
"info_form": info_form,
}
return render(request, "panel/info.html", context)
Обратите внимание, я также удалил логику, которая перезагружала пользователя. Если вы используете login_required
, пользователь всегда будет аутентифицирован.