Как я могу использовать параметр url (который является идентификатором пользователя <str:pk>) для предварительного заполнения поля в форме DJANGO

Я делаю приложение управления с 2 страницами: пользователи (клиенты) и страница данных пользователя, которая содержит историю платежей пользователя (чеки).

Я пытаюсь создать форму на странице истории платежей (cheques.html) для добавления нового платежа, но я хочу, чтобы Cheque.cliente был равен URL текущего пользователя. Например: если ваш URL - cheque/5/, то Cheque.cliente должен быть 5, и когда я добавляю новый платеж, платеж должен отслеживаться (ForeignKey) для пользователя 5 (у каждого пользователя много платежей).

Возобновление: Это приложение имеет функции для CRUD всех пользователей (клиентов) и всех платежей (чеков), но только функция добавления платежа (чека) не работает.

VIEWS.py

#CLIENTES
def index(request):
    clientes = Cliente.objects.all()
    
    form = ClienteForm()

    if request.method == 'POST':
        form = ClienteForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context = {'clientes':clientes, 'form':form}
    return render(request, 'clientes/home.html', context)

#CHEQUES
#THE ERROR IS IN THIS VIEW!
def chequesCliente(request, pk):
    cheques = Cheque.objects.filter(id=pk)
    nome = Cliente.objects.get(id=pk)
    
    formc = ChequeForm()

    if request.method == 'POST':
        formc = ChequeForm(request.POST)
        print(formc.data['cliente'])
        if formc.is_valid():
            print(formc.cleaned_data)
            formc.save()
            return redirect('/')

    context = {'cheques':cheques, 'formc':formc, 'nome':nome,}
    return render(request, 'clientes/cheques.html', context)

def updateCheque(request, pk):
    cheque = Cheque.objects.get(id=pk)

    formc = ChequeForm(instance=cheque)

    if request.method == 'POST':
        formc = ChequeForm(request.POST, instance=cheque)
        if formc.is_valid():
            formc.save()
            return redirect('/')

    context = {'formc':formc}
    return render(request, 'clientes/update_cheque.html', context)

def deleteCheque(request, pk):
    item = Cheque.objects.get(id=pk)

    if request.method == "POST":
        item.delete()
        return redirect('/')

    context = {'item':item}
    return render(request, 'clientes/delete_cheque.html', context)

URLS.py

    path('admin/', admin.site.urls),
    path('', views.index, name='lista'),
    path('update/<str:pk>/', views.updateCliente, name="update"),
    path('delete/<str:pk>/', views.deleteCliente, name="delete"),
    path('cheques/<str:pk>/', views.chequesCliente, name="lista_cheques"),
    #cliente/CRUD/num_cheque
    path('update_cheque/<str:pk>/', views.updateCheque, name="update_cheque"),
    path('delete_cheque/<str:pk>/', views.deleteCheque, name="delete_cheque"),
] 

MODELS.py

    nome = models.CharField(max_length=150)
    cpf = models.CharField(max_length=14)
    num = models.CharField(max_length=50)
    endereco = models.CharField(max_length=150)
    cidade = models.CharField(max_length=150)
    limite = models.DecimalField(max_digits=9, decimal_places=2)
    situacao = models.BooleanField(default=True)
    def __str__(self):
        return self.nome
class Cheque(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='cheques')
    banco = models.CharField(max_length=25)
    numero = models.IntegerField(default=0)
    valor = models.DecimalField(max_digits=20, decimal_places=2)
    emissao = models.DateField()
    vencimento = models.DateField()
    sem_fundos = models.BooleanField(default=False)
    def __str__(self):
        return self.banco 

FORMS.py

    class Meta:
        model = Cliente
        fields = '__all__'
class ChequeForm(forms.ModelForm):
    class Meta:
        model = Cheque
        fields = '__all__'
        exclude = ['cliente',]

TEMPLATES_cheques.HTML

        <div id="flex_subheader">  
          <button type="button" class="my_btn" id="retornar" onclick="location.href='{% url 'clientes:lista' %}'"><span>Retornar</span></button>
          <h2>{{ nome }}</h2></div>
        <div id="adicionar_cheque" class="criar">
          <form method="post" action=".">
            {% csrf_token %}
            {{ formc.non_field_errors }}
            <table>
            {{ formc.as_table }}
            <input type="submit" id="sub_cheque" value="Confirmar!">
            </table>
          </form>
        </div>
        <table class="table table-hover">
            <thead>
              <tr>
                <th scope="col">#</th>
                <th scope="col">Banco</th>
                <th scope="col">Número</th>
                <th scope="col">Valor</th>
                <th scope="col">Emissão</th>
                <th scope="col">Vencimento</th>
                <th scope="col">Sem Fundos</th>
              </tr>
            </thead>
            <tbody>
              {% for cheque in cheques %}
                <tr>
                  <th scope="row">{{ cheque.pk }}</th>
                  <td>{{ cheque.banco }}</td>
                  <td>{{ cheque.numero }}</td>
                  <td>{{ cheque.valor }}</td>
                  <td>{{ cheque.emissao }}</td>
                  <td>{{ cheque.vencimento }}</td>
                  <td>{{ cheque.sem_fundos }}</td>
                  <td><a href="{% url 'clientes:update_cheque' cheque.id %}" class="my_btn" id="editar">Editar</a></td>
                  <td><a href="{% url 'clientes:delete_cheque' cheque.pk %}" class="my_btn" id="excluir">Excluir</a></td>
                </tr>
              {% endfor %}
            </tbody>
          </table>
    </section>

TEMPLATES_clientes.html

                <tr>
                  <th scope="row">{{ cliente.pk }}</th>
                  <td> <a href="{% url 'clientes:lista_cheques' cliente.id %}"> {{ cliente.nome }} </a></td>
                  <td>{{ cliente.cpf }}</td>
                  <td>{{ cliente.num }}</td>
                  <td>{{ cliente.endereco }}</td>
                  <td>{{ cliente.cidade }}</td>
                  <td>{{ cliente.limite }}</td>
                  <td>{{ cliente.situacao }}</td>
                  <td><a href="{% url 'clientes:update' cliente.id %}" class="my_btn" id="editar">Editar</a></td>
                  <td><a href="{% url 'clientes:delete' cliente.id %}" class="my_btn" id="excluir">Excluir</a></td>
                </tr>
              {% endfor %}

При сохранении формы можно добавить параметр commit=False. Это создаст объект отправленных данных, но не сохранит его в базе данных (не существует первичного ключа). В объекте можно изменить данные, а когда закончите, сохранить объект:

if form.is_valid():
    obj = form.save(commit=False) # returns an instance of a model object without pk
    obj.field1 = some_value
    obj.save() # Save the object to the db
Вернуться на верх