簡體   English   中英

完整性錯誤不是 NULL 約束失敗,即使我在 model 中設置了空白=真,空=真

[英]Integrity Error NOT NULL constraint failed even though I have set blank=True, null=True in my model

嘗試保存我的 model 表單時,我的代碼中出現 NOT NULL 約束錯誤,即使我留空的字段在 models.py 中是可選的(已設置空白 = True,null = True)

我很困惑,我做錯了什么?

當我將第一個可選字段留空(描述)時,會彈出錯誤。 在 work.save() 之前手動填寫其中任何一個會將問題推送到下一個字段,並在所有字段都填滿時通過。

編輯:嘗試從管理儀表板創建工作實例時也會發生這種情況。

模型.py

class Work(models.Model):
    ## core fields
    creator = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,
                                   default=None)
    created = models.DateTimeField()
    modified = models.DateTimeField()
    work_slug = models.SlugField(max_length=50) # slug -> TBD: find way to assign default value to slug = archival number.

    archive = models.ForeignKey(Archive, on_delete=models.CASCADE)


    # superfolder -> replaces category, series etc with dynamic hierarchical database
    folder = models.ForeignKey(Folder, on_delete=models.CASCADE)
    

    # basic metadata fields
    name = models.CharField(max_length=50)
    year = models.CharField(max_length=50)
    medium = models.CharField(max_length=50)
    description = models.CharField(max_length=1200, blank=True, null=True)

    # optional metadata
    authors = models.CharField(max_length=50, blank=True, null=True)
    classification = models.CharField(max_length=50, blank=True, null=True)
    location = models.CharField(max_length=50, blank=True, null=True)
    link = models.URLField(max_length=50, blank=True, null=True)
    record_creator = models.CharField(max_length=50, blank=True, null=True) # revisit -> 

    # custom descriptors
    cd1_name = models.CharField(max_length=50, blank=True, null=True)
    cd1_value = models.CharField(max_length=50, blank=True, null=True)
    cd2_name = models.CharField(max_length=50, blank=True, null=True)
    cd2_value = models.CharField(max_length=50, blank=True, null=True)
    cd3_name = models.CharField(max_length=50, blank=True, null=True)
    cd3_value = models.CharField(max_length=50, blank=True, null=True)
    cd4_name = models.CharField(max_length=50, blank=True, null=True)
    cd4_value = models.CharField(max_length=50, blank=True, null=True)
    cd5_name = models.CharField(max_length=50, blank=True, null=True)
    cd5_value = models.CharField(max_length=50, blank=True, null=True)
    cd6_name = models.CharField(max_length=50, blank=True, null=True)
    cd6_value = models.CharField(max_length=50, blank=True, null=True)
    cd7_name = models.CharField(max_length=50, blank=True, null=True)
    cd7_value = models.CharField(max_length=50, blank=True, null=True)


    # Standardized Metadata


    # Methods
    def __str__(self):
        return 'Work: {}'.format(self.name)

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        user = get_current_user()

        if not self.id: # if the model is being created for the first time:
            self.creator = user # assign the currently logged in user as the creator
            self.created = timezone.now() # set the 'created' field to the current date and time
            # self.slug = **archival id of work (automatically determined)** 
        self.modified = timezone.now() # set the modified field to the current date and time. This is reassigned everytime the model is updated.

        return super(Work, self).save(*args, **kwargs)

forms.py

class WorkForm(ModelForm):
    class Meta:
        model = Work
        fields = ['name', 'year', 'medium', 'description', 'authors', 'classification', 'location', 'link', 'record_creator', 'cd1_name', 'cd1_value', 'cd2_name', 'cd2_value', 'cd3_name', 'cd3_value', 'cd4_name', 'cd4_value', 'cd5_name', 'cd5_value', 'cd6_name', 'cd6_value', 'cd7_name', 'cd7_value']

視圖.py

def add_work(request, folder_pk):
    '''
    Add a work to the filesystem.

    folder_pk: the primary key of the parent folder

    Checks if the user is logged in and if the user is the creator of the folder. If so, the user is allowed to add a work to the folder. Otherwise, the user is redirected to the login page.
    '''
    # add work to the database
    parent = Folder.objects.get(pk=folder_pk)
    mediaFormSet = modelformset_factory(MediaFile, fields=('name', 'alt_text', 'caption', 'media'), extra=1)

    

    if request.method == "POST" and parent.archive.creator == get_current_user():
        # if the form has been submitted
        # Serve the form -> request.POST
        form = WorkForm(request.POST)
        # mediaFormSet = mediaFormSet(request.POST)

        if form.is_valid(): # if the all the fields on the form pass validation

            # Generate archival ID for work
            # archival ID is random, unique 6 digit number that identifies the work
            archival_id = get_archival_id()

            # create a new work with the parameters retrieved from the form. currently logged in user is automatically linked
            work = form.save(commit=False)
            work.work_slug = archival_id
            work.folder=parent
            work.archive=parent.archive
            work.save()
            
            # Redirect to dashboard page
            return redirect('add_media_to_work', work_pk=work.pk)

    else:
        # If the form is not submitted (page is loaded for example)
        # -> Serve the empty form
        form = WorkForm()


    return render(request, "archival/add_edit_work.html", {"workForm": form})

我遇到了和你一樣的問題,我做了一個注冊表單,它給了我同樣的錯誤,因為在我填寫字段之前執行了.save()方法,沒有要保存的數據,因為那:字段類型是None 所以我剛剛實現了一個 if else 語句,以確保如果字段的類型為None ,則不會執行.save()方法,這是一個片段:

if field == None:
    pass
else:
    form.save()

暫無
暫無

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

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