<p>您不需要在模型表单上提供编辑函数,我建议使用基于类的泛型视图,因为它易于使用和扩展。以下是我的建议:</p>
<p>Forms.py</p>
<pre><code>class UpdateUserForm(ModelForm):
class Meta:
model = User
fields = ['first_name', 'last_name', 'email']
</code></pre>
<p>#views.py</p>
<pre><code>from django.views.generic import View
from .forms import UpdateUserForm
from django.contrib import messages
#import your forms and functions including UpdateUserForm
class UserView(View):
def get(self, *args, **kwargs):
form = UpdateUserForm(instance=self.request.user)
context = {'form':form}
return render(self.request, template, context)
def post(self, *args, **kwargs):
form = UpdateUserForm(self.request.POST or None, instance=self.request.user)
if form.is_valid():
form.save()
messages.success(self.request, 'Info updated')
return redirect('user-profile')
context = {'form':form}
messages.error(self.request, 'Please, check the form for errors')
return render(self.request, template, context)
#function based view
def update_user(request):
form = UpdateUserForm(instance=request.user)
if request.method == 'POST':
form = UpdateUserForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return render(...)
return render(request, template, {'form':form}
</code></pre>
<p>这就是我为用户信息更新创建视图的方式,它就像一个符咒</p>
<p>模板文件</p>
<pre><code>{% extends 'base.html' %}
{% block title %} Edit Profile {% endblock %}
{% block body %}
<div class="edit-form">
<div class="container">
<div class="my-form">
<form method="post">
{% csrf_token %}
{% for field in form %}
<div
class="input-group no-border form-control-lg {% if field.errors %} has-danger {% endif %} ">
<span class="input-group-prepend">
<div class="input-group-text">
<i class="now-ui-icons users_single-02"></i>
</div>
</span>
{% render_field field class="form-control" %}
</div>
{% if field.errors %}
{% for error in field.errors %}
<div class="text-left text-danger font-weight-bolder">
<p>{{ error|escape}}</p>
</div>
<script>
$('.form-control').addClass('form-control-danger')
</script>
{% endfor %}
{% endif %}
{% endfor %}
<button type="submit" class="btn btn-primary btn-lg">Change Password</button>
</form>
</div>
</div>
</div>
{% include 'base_footer.html' %}
{% endblock %}
</code></pre>
<p>如果使用引导,则可以使用Javascript添加样式</p>
<pre><code>{% block page_script %}
<script>
var $list = $("form :input[type='text']");
$list.each(function () {
$(this).addClass("form-control");
});
var $select = $("form select");
$select.each(function () {
$(this).addClass("custom-select w-90");
});
var $select = $("form textarea");
$select.each(function () {
$(this).addClass("form-control");
});
var $list = $("form :input[type='number']");
$list.each(function () {
$(this).addClass("form-control");
});
</code></pre>
<pre><code>{% endblock %}
</code></pre>