我目前有一个可以成功更新模型User
和的表格Client
。
我唯一希望做的就是访问更新页面时,表单已经具有当前信息(就像我们可以使用占位符一样,但是实际上是可编辑的数据),以便客户端可以编辑他需要的内容。
我也想知道是否有一种方法可以只更新更改的字段,或者是否必须更新所有内容,即使它是相同的。
这是我的表格:
class UpdateClient(ModelForm):
address = forms.CharField(max_length=200, label="Morada", widget=forms.TextInput(attrs={'class': 'form-control'}))
nif = forms.CharField(max_length=9, label="NIF", validators=[RegexValidator(r'^\d{1,10}$')], widget=forms.TextInput(attrs={'class': 'form-control'}))
mobile = forms.CharField(max_length=9, label="Telemóvel", validators=[RegexValidator(r'^\d{1,10}$')], widget=forms.TextInput(attrs={'class': 'form-control'}))
def clean_nif(self):
nif = self.cleaned_data['nif'];
if Clients.objects.filter(nif=nif).exists(): raise forms.ValidationError("NIF já existente.")
return nif
def __init__(self, *args, **kwargs):
super(UpdateClient, self).__init__(*args, **kwargs)
self.fields['first_name'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['last_name'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['email'].widget = EmailInput(attrs={'class': 'form-control'})
class Meta:
model = User
fields = ('email','first_name','last_name', 'address', 'nif', 'mobile')
这是我的views.py
:
def client_det(request, nif):
ls= Clients.objects.get(nif=nif)
if request.method == 'POST':
form = UpdateClient(request.POST, instance=ls.user)
if form.is_valid():
user = form.save()
user.refresh_from_db()
user.clients.address = form.cleaned_data.get('address')
user.clients.nif = form.cleaned_data.get('nif')
user.clients.mobile = form.cleaned_data.get('mobile')
user.clients.save()
return redirect('clients')
else:
form = UpdateClient()
return render(request, 'backend/client_detail.html', {'form': form, 'ls': ls})
和我的 client_detail.html
<form method="post">
{% csrf_token %}
<!-- Address -->
<h6 class="heading-small text-muted mb-4">Dados Cliente</h6>
<div class="pl-lg-4">
<div class="row">
<div class="col-lg-4">
<div class="form-group">
<label class="form-control-label" for="input-first-name">Primeiro Nome</label>
{{form.first_name}}
</div>
(...)
实例化表单时,请为GET分支提供实例,就像在POST分支中一样。
def client_det(request, nif):
ls= Clients.objects.get(nif=nif)
if request.method == 'POST':
form = UpdateClient(request.POST, instance=ls.user)
...
else:
form = UpdateClient(instance=ls.user)
return render(request, 'backend/client_detail.html', {'form': form, 'ls': ls})
编辑:我想念您的问题部分,那里您也需要客户信息集。
我认为,您可以__init__
在表单上的函数中执行此操作,也可以通过初始参数传递值。
范例1:
def __init__(*args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance:
self.fields['nif'] = self.instance.clients.nif
...
范例2:
form = UpdateClient(instance=ls.user, initial={"nif": ls.user.clients.nif, ...})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句