如何在 Django 中以更新形式显示数据库中已有的数据?
How to show data already on the database in a update form in Django?
我目前有一个表格可以成功更新模型 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, ...})
我目前有一个表格可以成功更新模型 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, ...})