Как показать данные уже в базе данных в форме обновления в Django? - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время у меня есть форма, которая успешно обновляет модель 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>

(...)

1 Ответ

0 голосов
/ 19 февраля 2020

При создании экземпляра формы укажите экземпляр для ветви 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, ...})
...