4

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ます。現在、フォームは各フィールドに値を指定した場合にのみ機能します。

4

2 に答える 2

5

更新プロセス中にカスタム ハッシュを使用してパスワードを暗号化しています。編集ページにアクセスして更新ボタンを押すと、現在の暗号化された形式の古いパスワードが再暗号化されるため、古いパスワードが失われます

passwordそれ自体をフォームに含めないことでそれを処理します。new_password代わりに、新しいパスワードを入力できるように新しいフィールド (のようなもの) を追加します。次に、is_validコンテンツがある場合は、メソッドでパスワードをそのフィールドのハッシュ値に設定します。

また、重要な値のフィルタリングツールを使用して、電子メールで送信されるエラー レポートにユーザー パスワードが表示されないようにする必要があります。

class UpdateForm(forms.ModelForm):
    class Meta:
        model = user
        fields = ('first_name', 'last_name', 'email', 'username')
    new_password = forms.CharField(required=False, widget=forms.widgets.PasswordInput)

そして、あなたの見解では:

@sensitive_variables('new_password')
@sensitive_post_parameters('new_password')
def form_valid(self, form):
    clean = form.cleaned_data
    new_password = clean.get('new_password')
    if new_password:
        #encrypt plain password
        form.instance.password = hash_password(new_password)
    return super(AccountUpdate, self).form_valid(form)
于 2013-08-20T20:03:24.237 に答える
0

最も簡単な方法は、フィールドに既存のものを事前に入力することです。{{ account.name }}または何でもテンプレートでこれを行います。

于 2013-08-20T19:30:39.217 に答える