Я использую UpdateView для обновления ряда полей. Однако мне нужны только те поля, которые были изменены для сохранения в базе данных. Если в процессе обновления не было задано значение поля, я хочу, чтобы предыдущее значение использовалось как значение по умолчанию. Если для поля было предоставлено новое значение, то необходимо обновить только это поле. Как я могу это сделать?Django: обновлять поля, которые были изменены в UpdateView
#views.py
class AccountUpdate(UpdateView):
""" Updates an account; unchanged fields will not be updated."""
context_object_name = 'account'
form_class = UpdateForm
template_name = 'accounts/update_account.html'
success_url = '/accounts/home'
def get_object(self, queryset=None):
return self.request.user
def form_valid(self, form):
clean = form.cleaned_data
#encrypt plain password
form.instance.password = hash_password(clean['password'])
context = {}
self.object = context.update(clean, force_update=False)
return super(AccountUpdate, self).form_valid(form)
#templates
{% extends 'base.html' %}
<title>{% block title %}Update Account{% endblock %}</title>
{% block content %}
{{ account.non_field_errors }}
<div class="errors" style="list-style-type: none;">
{% if account.first_name.errors %}{{ account.first_name.errors }}{% endif %}
{% if account.last_name.errors %}{{ account.last_name.errors }}{% endif %}
{% if account.email.errors %}{{ account.email.errors }}{% endif %}
{% if account.password.errors %}{{ account.password.errors }}{% endif %}
{% if account.username.errors %}{{ account.username.errors }}{% endif %}
</div>
<form action="" name="edit" method="post">
{% csrf_token %}
<ul>
<li>Fullname</li>
<li> {{ form.first_name }}{{ form.last_name }}</li>
<li>Email</li>
<li>{{ form.email }}</li>
<li>Password</li>
<li>{{ form.password }}</li>
<li>Username</li>
<li>{{ form.username }}</li>
</ul>
<ul>
<li><input type="submit" value="update account"></li>
</ul>
</form>
<ul>
<li class="nav"><a href="/accounts/">cancel changes</a></li>
</ul>
{% endblock %}
Все поля также объявлены в соответствии с требованиями models.py
. В настоящее время форма работает только в том случае, если я предоставляю значение для каждого поля.
Спасибо за это решение. Основываясь на вашем комментарии к ответу Роба, я думаю, что смогу решить проблему с отдельным полем. Я отправлю свое решение после завершения. Благодаря! – Staccato
Я не совсем уверен, какую другую проблему с обновлением поля вы имеете - это должно быть безвредным для установки, скажем, 'first_name =« Joe », если он не изменился. –
Если update_form предварительно заполнена 'first_name = 'joe'', но пользователь решает удалить значение в этом поле на странице обновления и оставить его пустым, я хочу, чтобы' first_name' по умолчанию возвращался на 'joe'. Извините за путаницу. – Staccato