簡體   English   中英

使用 Django 模型表單在數據庫中保存外鍵數據時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM