Почему данные моей формы 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})