我目前有一个可以成功更新模型User
和Client
的表格。
我唯一想要做的就是,当访问更新页面时,表单已经具有current信息(例如我们可以使用占位符,但实际上是可编辑的数据),以便客户端可以进行编辑他需要什么。
我也想知道是否有一种方法可以仅更新更改的字段,或者即使必须相同,也必须更新所有内容。
这是我的表格:
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, ...})