如何在Django中以更新形式显示数据库中已经存在的数据?

问题描述 投票:0回答:1

我目前有一个可以成功更新模型UserClient的表格。

我唯一想要做的就是,当访问更新页面时,表单已经具有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>

(...)
python django django-3.0
1个回答
0
投票

实例化表单时,为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, ...})
© www.soinside.com 2019 - 2024. All rights reserved.