Как создать запись из GET-данных (форма не проходит валидацию)

Я запутался, когда пытаюсь вставить запись из запроса "GET"

Я постараюсь объяснить, что я хочу сделать.

Я создаю приложение для инвентаризации имущества.

В моей базе данных есть 3 таблицы.

У меня есть основная таблица под названием fixed asset("ActFijo"), в которой зарегистрированы все активы моей компании.

Вызов Инвентаризация ("Inventario"), в котором хранится название каждого инвентаря

а другой называется Inventory_detail ("Инвентаризация_деталей"), где хранятся детали или активы, в которых они учитываются, чтобы убедиться, что оборудование или мебель не украдены в этом месте.

Из главной таблицы ("ActFijo") я должен найти мебель или актив и сохранить его в таблице деталей ("Inventario_detalle")

Я запутался, я не знаю, как работать с GET запросом, а затем делать POST в одном запросе

Нужно ли мне писать код по частям в GET-запросе, а затем POST? Или я могу сделать все в GET-запросе?

Вот код, который у меня есть на данный момент. Я не знаю, нормально ли это, пожалуйста, мне нужно руководство

Например, мой код не проходит валидацию формы.

if form.is_valid():

Я пытаюсь напечатать, но я не вижу никакой ошибки валидации, он ничего не печатает

print(form.errors)

Views.py

from django.shortcuts import redirect, render
from .form import InventarioDetalle_Form, InventarioForm
from .models import ActFijo, Inventario, Inventario_detalle

# Create your views here.


def inventario_home_view(request):
    if request.method == "GET":
        inv = Inventario.objects.all()
        context = {"inventarios": inv}
        return render(request, "inventario/index.html", context)


def inventario_crear_view(request):
    if request.method == "POST":
        form = InventarioForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("inventario-home")
    else:
        form = InventarioForm()
    inv = Inventario.objects.all()
    context = {"formulario": form, "inventarios": inv}

    return render(request, 'inventario/crear.html', context)


def inventario_detalle_view(request, inventario):
    if request.method == "GET":
        # Obtener el valor del input "Buscar"
        codigo_activo = request.GET.get("buscar")
        print("[CODIGO ACTIVO]:", codigo_activo)
        # Buscar el activo en la bd por el campo codigo
        try:
            activo = ActFijo.objects.get(codigo=codigo_activo)
            # print(activo)
        except ActFijo.DoesNotExist:
            activo = None
        if activo:
            form = InventarioDetalle_Form(instance=activo)
            # print(form)
            print(form.errors)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.inventario_id = inventario
                instance.save()
            else:
                print(
                    "This request does not pass the validation")
        else:
            print(
                "The element does not exist")
    context = {"item": Inventario_detalle.objects.all()}
    return render(request, "inventario/detalle.html", context)

form.py:

from django import forms

from .models import Inventario, Inventario_detalle


class InventarioForm(forms.ModelForm):
    class Meta:
        model = Inventario
        fields = '__all__'


class InventarioDetalle_Form(forms.ModelForm):
    class Meta:
        model = Inventario_detalle
        fields = '__all__'

url.py

from django.urls import path
from django import views
from . import views

urlpatterns = [
    path("", views.inventario_home_view, name="inventario-home"),
    path("create/", views.inventario_crear_view,
         name="inventario-create"),
    path('detail/<int:inventario>',
         views.inventario_detalle_view, name="inventario-detail"),
]

detail.html

{% extends "core/base.html" %} {% block content%}
<div class="container-fluid">
  <div class="row">
    <div class="col-md-12">
      <div class="titulo mt-5">
        <h1>Inventario Detalle</h1>
      </div>
      <form method="get">
        <input type="text" class="form-control" placeholder="Buscar Activo" name="buscar" />
      </form>
      <div style="overflow-x: auto">
        <table>
          <thead>
            <tr>
              <th>Codigo</th>
              <th>Descripcion</th>
              <th>Accion</th>
            </tr>
          </thead>
          <tbody>
            {% for i in item %}
            <tr>
              <td>{{i.codigo}}</td>
              <td>{{i.descripcion}}</td>
              <td><button type="button" class="btn btn-danger">Eliminar</button></td>
            </tr>
          </tbody>
          {% endfor %}
          </tbody>
        </table>
      </div>
      <div>{{request.GET}}</div>
    </div>
  </div>
</div>

{% endblock %}

Проблема здесь

def inventario_detalle_view(request, inventario):
    if request.method == "GET":
        codigo_activo = request.GET.get("buscar")
        print("[CODIGO ACTIVO]:", codigo_activo)
        try:
            activo = ActFijo.objects.get(codigo=codigo_activo)
            print(activo)
        except ActFijo.DoesNotExist:
            activo = None
        if activo:
            form = InventarioDetalle_Form(instance=activo)
            print(form.errors)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.inventario_id = inventario
                instance.save()
            else:
                print(
                    "This request does not pass the validation")
        else:
            print(
                "The element does not exist")
    context = {"item": Inventario_detalle.objects.all()}
    return render(request, "inventario/detalle.html", context)

Я полагаю, что вы не видите ошибок валидации на форме, потому что для GET-запроса вы ничего не передаете. Единственное, что вы передаете в форму, это экземпляр модели, и вы выполняете form.is_valid на нем, что не имеет смысла. Вам вообще не нужно использовать форму. Вместо этого используйте это.

def inventario_detalle_view(request, inventario):
    if request.method == "GET":
        codigo_activo = request.GET.get("buscar")
        print("[CODIGO ACTIVO]:", codigo_activo)
        try:
            activo = ActFijo.objects.get(codigo=codigo_activo) # get activo object
            activo.inventario_id = inventario # update object
            activo.save() # save changes
            print(activo)
        except ActFijo.DoesNotExist:
            # you can do anthing here
            # maybe redirect with a message..
            pass

    context = {"item": Inventario_detalle.objects.all()}
    return render(request, "inventario/detalle.html", context)
Вернуться на верх