Почему данные моей формы Django не отображаются в базе данных?

Я пытаюсь разработать простую форму ввода для сохранения депозита за рыболовное судно. Судно и сеть являются таблицами в базе данных. При отправке формы не возникает ошибки, но в фоновом режиме ничего не происходит. Я использую базу данных PostgreSQL с PgAdmin для проницательности. Я немного застрял, так как это мой первый опыт работы с Django.

Я попробовал добавить поле dep_id в форму, но это ничего не изменило.

[forms.py]

from django import forms
from django.forms import ModelForm
from myapp.models import Deposit


class UploadForm(ModelForm):
    dep_date = forms.DateInput()
    harbour = forms.TextInput()
    vessel = forms.NumberInput()
    net = forms.NumberInput()
    amount = forms.DecimalField()

    class Meta:
        model = Deposit
        fields = ['dep_date', 'harbour', 
                    'vessel', 'net', 
                    'amount']    

[models.py]

from django.db import models

class Vessel(models.Model):
    VID = models.IntegerField(primary_key=True, default=None)
    vessel_name = models.CharField(max_length=100)
    flag = models.CharField(max_length=100)
    
    registration_number = models.CharField(max_length=100)
    WIN = models.CharField(max_length=100)
    IRCS = models.CharField(max_length=100)
    
    vessel_type = models.CharField(max_length=250)
    fishing_methods = models.CharField(max_length=255)
    length = models.DecimalField(default=0, max_digits=5, decimal_places=2)
    
    auth_period_from = models.CharField(max_length=100)
    auth_period_to = models.CharField(max_length=100)



class Net(models.Model):
    net_id = models.IntegerField(primary_key=True, default = None)
    prod_date = models.DateField()
    weight = models.DecimalField(default=0, max_digits=6, decimal_places=2)
    material = models.CharField(max_length=100)
    fishing_type = models.CharField(max_length=100, default=None)


class Deposit(models.Model):
    dep_id = models.BigAutoField(primary_key=True, default=None)
    dep_date = models.DateField()
    harbour = models.CharField(max_length=100)
    vessel = models.ForeignKey(Vessel, to_field='VID', on_delete=models.CASCADE)
    net = models.ForeignKey(Net, to_field='net_id', on_delete=models.CASCADE)
    amount = models.DecimalField(default=0, max_digits=5, decimal_places=2)

[views.py]

from django.shortcuts import render, redirect
from .models import Vessel
from .forms import UploadForm

def put_deposit(request):
    if request.POST:    
        form = UploadForm(request.POST)
        print(request)
        if form.is_valid():
            form.save()
        redirect(index)
    return render(request, 'upload.html', {'form' : UploadForm})

[upload.html]

<p> Upload </p>
<form method="POST" action="{% url 'put_deposit' %}" enctype="multipart/form-data"> 
    {% csrf_token %}
    
    {{form}}
    <button> Submit </button>
</form>


Возможно, я неправильно установил какую-то зависимость или это проблема с ключом?

Это скорее предложение по устранению неполадок, но его трудно показать в комментарии. Возможно, ваша форма не проходит проверку по той или иной причине - добавьте это, чтобы проверить, есть ли ошибки:

def put_deposit(request):
    if request.POST:    
        form = UploadForm(request.POST)
        print(request)
        if form.is_valid():
            form.save()
        else:
            print(form.errors) # add these two lines
        redirect(index)
    return render(request, 'upload.html', {'form' : UploadForm})

Вы используете ModelForm, но затем добавляете поля, которые уже есть в вашей модели, в форму, как если бы это была обычная form. Вы можете добавить дополнительные поля в вашу ModelForm, делая это, но поскольку вы добавляете одинаковые поля, возможно, именно поэтому она не проходит валидацию.

Предложение: Попробуйте

(1) То, что уже предложил @Milo - вывести form.errors, чтобы увидеть, действительно ли форма действительна или нет,

(2) Измените свою форму на:

class UploadForm(ModelForm):

    class Meta:
        model = Deposit
        fields = ['dep_date', 'harbour', 
                    'vessel', 'net', 
                    'amount']   

(3) Также, хотя я не думаю, что именно это является причиной ошибки, у вашего представления есть некоторые проблемы. Попробуйте:

def put_deposit(request):
    form = UploadForm(request.POST or None)
    print(request.POST)
    if form.is_valid():
        form.save()
        redirect('index')
    else:
        print(form.errors)
    return render(request, 'upload.html', {'form' : form})
Вернуться на верх