模型.py
class Job(models.Model):
jobname = models.CharField(max_length = 1000)
owner = models.CharField(max_length = 150)
enabled = models.BooleanField(default = True)
freq_type = models.IntegerField(default = 1)
freq_interval = models.IntegerField(default = 0)
freq_recurrence = models.IntegerField(default = 0)
start_date=models.CharField(max_length=10)
end_date=models.CharField(max_length=10, blank = True)
start_time=models.CharField(max_length=6)
end_time=models.CharField(max_length=6, blank = True)
date_added = models.DateTimeField(default=timezone.now)
date_modified=models.DateTimeField(null = True)
version=models.IntegerField(default = 1)
class Job_detail(models.Model):
job_type=models.IntegerField()
json = models.CharField(max_length = 1000)
jobid = models.ForeignKey(Job, on_delete=models.CASCADE)
class Job_track(models.Model):
status = models.IntegerField(default = 3)
output = models.CharField(max_length=500, blank = True)
location = models.CharField(max_length = 500, blank = True)
jobid = models.ForeignKey(Job, on_delete=models.CASCADE)
jobdetailid = models.ForeignKey(Job_detail, on_delete=models.CASCADE)
表格.py
class JobForm(ModelForm):
class Meta:
model = Job
fields = []
class JobDetailForm(ModelForm):
class Meta:
model = Job_detail
fields = []
exclude = ['jobid']
class JobTrackForm(ModelForm):
class Meta:
model= Job_track
fields = []
exclude = ['jobid', 'jobdetailid']
在我的意見功能內:
def device_port_selected(request, pk):
devices = Device.objects.get(pk=pk)
if request.method == "POST":
job = JobForm(request.POST)
jobdetail = JobDetailForm(request.POST)
jobtrack = JobTrackForm(request.POST)
if job.is_valid() and jobdetail.is_valid() and jobtrack.is_valid():
#For Job
j = job.save(commit=False)
hostname = devices.id
print(type(hostname))
ipaddr = devices.ipaddr
print(type(ipaddr))
name = str(hostname) ',' ipaddr
j.jobname=name
current_user = request.user
j.owner = current_user.username
j.enabled = "True"
j.freq_type = 1
j.freq_interval = 0
j.freq_recurrence = 0
servicedate = request.POST.get('servicedate','')
print(servicedate)
j.start_date = servicedate
servicetime = request.POST.get('servicetime','')
print(servicetime)
j.start_time = servicetime
j.version = 1
j.save()
#For Job_detail
jobd = jobdetail.save(commit=False)
selection=request.POST.get('portrange','')
mode=request.POST.get('portmode','')
status=request.POST.get('portstatus','')
portpara1 = request.POST.get('portpara1','')
portpara2 = request.POST.get('portpara2','')
if selection == "":
messages.warning(request, "Please select the ports that you want to configure")
return render(request, 'interface/device_port_selected.html',{'devices':devices, 'righttable':righttable, 'job':job} )
combined={"port_range":selection, "port_mode":mode, "port_status":status, "port_param1":portpara1, "port_param2": portpara2}
combinedfinal = {"device":hostname, "ip":ipaddr, "configuration":combined}
jobd.job_type=1
jobd.json = combinedfinal
jobd.save()
#For Job_track
jobt=jobtrack.save(commit=False)
jobt.status=3
jobt.save()
return redirect('/device/', {'device':Device.objects.all, 'devices':device})
else:
print(job.errors)
print(jobdetail.errors)
print(jobtrack.errors)
return render(request, 'interface/device_port_selected.html',{'devices':devices, 'righttable':righttable} )
else:
job = JobForm(request.POST)
jobdetail = JobDetailForm(request.POST)
jobtrack = JobTrackForm(request.POST)
return render(request, 'interface/device_port_selected.html',{'devices':devices, 'righttable':righttable, 'job':job, 'jobdetail':jobdetail, 'jobtrack':jobtrack} )
當我嘗試按下瀏覽器中的提交按鈕時,出現以下錯誤
NOT NULL constraint failed: interface_job_detail.jobid_id
如果我宣告它鏈接到哪個表,外鍵不應該自己生成嗎?我掛鉤jobid的Job_detail表Job的表。但它似乎不起作用。任何人都可以解釋我怎么做錯了并向我展示了糾正這個問題的方法嗎?
更新:
我exclude從表單中洗掉了,但仍然遇到相同的錯誤。
uj5u.com熱心網友回復:
您創建并保存了一個Job實體(名為j),但Job_detail實體 ( jobd)無法自動與該實體相關聯。您必須在保存實體之前專門填充外鍵,即
jobd.jobid = j
jobd.save()
對于Job_track實體 ( jobt)類似:
jobt.jobid = j
jobt.jobdetailid = jobd
jobt.save()
作為旁注,請查看PEP-8并嘗試根據它命名您的類(例如JobDetail代替Job_detail)和變數(job_d或更好的job_detail代替jobd)。您當前的命名方案令人困惑。
uj5u.com熱心網友回復:
因為你使用了commit=False,就是不把實體存入db。
這個 save() 方法接受一個可選的 commit 關鍵字引數,它接受 True 或 False。如果您使用 commit=False 呼叫 save(),那么它將回傳一個尚未保存到資料庫的物件。在這種情況下,您可以在生成的模型實體上呼叫 save() 。如果您想在保存物件之前對其進行自定義處理,或者您想使用專門的模型保存選項之一,這將非常有用。默認情況下,commit 為 True。
當您的模型與另一個模型具有多對多關系時,會看到使用 commit=False 的另一個副作用。如果您的模型具有多對多關系,并且您在保存表單時指定 commit=False,則 Django 無法立即保存多對多關系的表單資料。這是因為在實體存在于資料庫中之前,不可能為實體保存多對多資料。
為了解決這個問題,每次使用 commit=False 保存表單時,Django 都會向 ModelForm 子類添加一個 save_m2m() 方法。在您手動保存表單生成的實體后,您可以呼叫 save_m2m() 來保存多對多表單資料。
您可以從檔案中看到這一點:
https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/#the-save-method
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346097.html
