[英]Error while saving foreign key data in database using Django Model Form
我的項目有兩個模型,1. 類別模型和 2. 課程模型
課程模型與我的類別模型有一個外鍵引用,如下所示。
class Category(models.Model):
categoryname = models.CharField(max_length=200,null=True,blank=True, default="")
class Courses(models.Model):
coursename = models.CharField(max_length=200,null=True,blank=True, default="")
course_category = models.ForeignKey(Category, related_name="courses", blank=True,null=True,on_delete=models.CASCADE)
logo = models.ImageField(upload_to='courselogos', null=True, blank=True)
最初我使用的是 HTML 表單,並且能夠將特定類別下的課程數據保存到數據庫中:
def add_course(request):
if request.method == 'POST':
course_name = request.POST.get('coursname')
categoryid = request.POST.get('category_id')
category = Category.object.get(id=category_id)
course_logo = request.FILES.get('logo')
course = Courses(coursename=course_name, course_category=category, logo= course_logo)
course.save()
return redirect('/all_category')
后來我決定繼續使用 Django 模型表單,並嘗試按如下方式實現代碼
class AddCourseForm(forms.ModelForm):
class Meta:
model = Courses
fields = ('coursename', 'course_category', 'logo')
widgets = {
'coursename' : forms.TextInput(attrs={'class':'form-control'}),
}
def __init__(self, *args, **kwargs):
category_id = kwargs.pop('category_id',1)
super(AddCourseForm, self).__init__(*args, **kwargs)
self.fields['course_category']=forms.ModelChoiceField(widget=forms.TextInput(), queryset=Category.objects.filter(id=category_id))
稍后在視圖中,我將數據保存為
def add_course(request):
if request.method == 'POST':
addcourse = AddCourseForm(request.POST, request.FILES)
if addcourse.is_valid():
addcourse.save()
return redirect('/all_category')
在我的 HTML 頁面上,我將輸入作為 1,2,3....等作為 category_id 值傳遞給“course_category”輸入字段,我已將表單中的字段呈現為
{{form.course_category}}
在我的“course_category”輸入字段值為 1 時提交表單時,它將數據保存到數據庫中,但當輸入字段值為 2 時,它甚至沒有進入視圖函數中 addcourse.is_valid() 的 if 條件。
因為我是新的 Django,所以我無法找到正確的方法來獲取 ForeignKey 值動態保存引用該類別的數據。 此外,我想在編輯時將相同的數據填充回表單。
請指導,先謝謝了。
稍微調試一下代碼后,我修改了 AddCourseForm 類中的 init 函數,如下所述,解決了我的問題,但我不是這樣做的正確方法
def __init__(self, *args, **kwargs):
category_id = None
for key in args[0:1]:
category_id = args[0].get('course_category')
super(AddCourseForm, self).__init__(*args, **kwargs)
self.fields['course_category']=forms.ModelChoiceField(widget=forms.TextInput(), queryset=Category.objects.filter(id=category_id))
我不認為這樣做應該那么困難,這是您通常如何在表單中設置course_category
選項的方法:
# forms.py
class AddCourseForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
self.course_categories = Category.objects.all()
super(AddCourseForm, self).__init__(*args, **kwargs)
self.fields['course_category'].queryset = self.course_categories
如果要在表單中設置特定類別,可以在視圖中傳遞初始值:
# views.py
def add_course(request, pk):
# note: you can pass the category primary key to your view, you need to
# specify this in your URLs and then your template
course_category = Category.objects.get(pk=pk)
form = AddCourseForm(initial={'course_category': course_category})
如果你想完全取消所有其他選項,你可以使用初始值來設置你的過濾器:
# forms.py
class AddCourseForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
super(AddCourseForm, self).__init__(*args, **kwargs)
self.fields['course_category'].queryset = Category.objects.filter(
pk=self.fields['course_category'].initial)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.