我嘗試開發一個簡單的輸入表單來為漁船節省押金。容器和網是資料庫中的表。提交表單時沒有錯誤,但后臺沒有任何事情發生。我使用帶有 PgAdmin 的 PostgreSQL 資料庫來獲取見解。我有點卡住了,因為這是我第一次使用 Django。
我嘗試將 dep_id 欄位添加到表單中,但它沒有任何改變。
[表格.py]
from django import forms
from django.forms import ModelForm
from myapp.models import Deposit
class UploadForm(ModelForm):
dep_date = forms.DateField()
harbour = forms.CharField()
vessel = forms.ModelChoiceField(queryset=Vessel.objects.all())
net = forms.ModelChoiceField(queryset=Net.objects.all())
amount = forms.DecimalField()
class Meta:
model = Deposit
fields = ['dep_date', 'harbour',
'vessel', 'net',
'amount']
[模型.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)
[視圖.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})
[上傳.html]
<p> Upload </p>
<form method="POST" action="{% url 'put_deposit' %}" enctype="multipart/form-data">
{% csrf_token %}
{{form}}
<button> Submit </button>
</form>
也許我有任何依賴錯誤或者是密鑰問題?
uj5u.com熱心網友回復:
您正在使用ModelForm,但隨后將模型中已有的欄位添加到表單中,就好像它是常規表單一樣。您可以通過這樣做向您的 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})
uj5u.com熱心網友回復:
這更像是一個故障排除建議,但很難在評論中顯示。您的表單可能由于某種原因無法驗證 - 添加此內容以查看是否有錯誤:
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})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535279.html
