簡體   English   中英

在Django中發布表單時無法保存數據

[英]Can't save data when posting form in Django

我正在按照Django教程構建一個小站點,你可以在站點中添加頁面和類別,我定義了一個Page模型如下:

class Page(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    title = models.CharField(max_length=128)
    url = models.URLField()
    views = models.IntegerField(default=0)

    def __str__(self):
        return self.title

並定義了如下的模型:

class PageForm(forms.ModelForm):
    title = forms.CharField(max_length=128, help_text="Please enter the title of this page")
    url = forms.URLField(max_length=200, help_text="Please enter the URL of the page")
    views = forms.IntegerField(widget=forms.HiddenInput(),initial=0)
    category = forms.ModelChoiceField(queryset=Category.objects.all(),help_text="Please choose a category for the page")

    class Meta:
        model = Page
        fields = '__all__'

和add_page的視圖是:

def add_page(request):

     if request.method == 'POST':
        form = PageForm(request.POST)

        if form.is_valid():
           page = form.save(commit=True)
           print(page)
           page.views = 0
           page.save()
           return index(request)
        else:
           print('error')
           form.errors
    else:
        form = PageForm()
        context_dict = {'form':form}

    return render(request,'rango/add_page.html',context_dict)

但是當我運行網站並在現場填寫這樣的信息時:

  1. 在選擇窗口中選擇“HTML”類別
  2. 在名稱字段中填寫'w3c'
  3. 在網址字段填寫“ http://www.w3cshools.com

並選擇“創建頁面”但單擊按鈕后沒有響應也沒有將表單中的數據添加到數據庫中,我嘗試使用print進行調試,發現數據無法通過驗證哪個沒有進程if塊'form.is_valid()'但我無法理解為什么以及如何修改。

我的類別模型定義為:

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique=True)

    def save(self,*args,**kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args,**kwargs)

    def __str__(self):
        return self.name

類別形式:

class CategoryForm(forms.ModelForm):
    name = forms.CharField(max_length=128, help_text="Please enter the category name.")
    views = forms.IntegerField(widget=forms.HiddenInput(),initial=0)
    likes = forms.IntegerField(widget=forms.HiddenInput(),initial=0)
    slug = forms.CharField(widget=forms.HiddenInput(),required=False)

    class Meta:
        model = Category
        fields = ('name',)

而不是像你在這里設置初始

views = forms.IntegerField(widget=forms.HiddenInput(),initial=0)

只需使用它

views = forms.IntegerField(widget=forms.HiddenInput())

然后改變這個

form = PageForm(request.POST)

對此

form = PageForm(request.POST, initial={"views": "0"})

我指的是這篇文章

只需在PageForm中排除字段'category',重啟服務器即可。

改變你的觀點,

def add_page(request): 
    if request.method == 'POST': 
        form = PageForm(request.POST)
        if form.is_valid(): 
            page = form.save(commit=False)
            page.views = 0 
            page.save()
            return redirect('index') 
        else: 
            render(request, 'rango/add_page.html', {'form':'form.errors'}
    else: 
        form = PageForm()
    context_dict = {'form':form}
    return render(request,'rango/add_page.html',context_dict)

在保存表單時,您應該將commit=False用於添加其他數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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