在 Django 模型保存方法中需要帮助

Posted

技术标签:

【中文标题】在 Django 模型保存方法中需要帮助【英文标题】:Need help in Django Model save method 【发布时间】:2014-09-22 11:30:11 【问题描述】:

需要 Django 模型 save() 方法的帮助。 如果我的模型 save() 方法中的某些条件为假,我需要重定向回人员列表页面或人员表单。 目前我使用了验证错误,但我正在寻找重定向回列表页面或表单。如果我使用 return 语句,总是会成功添加而不保存。 这里我需要一个重定向而不是“raise ValidationError(u"Enter a valid name")。

提前致谢 贾斯汀

#Models.py 
from django.db import models
from django.core.exceptions import ValidationError

class Person(models.Model):
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    address = models.TextField(max_length=300, blank=True)

    def save(self, *args, **kwargs):
        if self.first_name == "":   #(Some condition check, not a simple field value )
                raise ValidationError(u"Enter a valid name")
        # Need a redirection back to Django Admin Persons list page or to Add Person Page with error message
        # But always showing added successfully, if i use a return or redirection.
        else:
            super(Person,self).save(*args, **kwargs)

#admin.py

from django.contrib import admin
from testapp.models import Person
from testapp.forms import PersonAdminForm
from django.contrib import messages

# Register your models here.

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name')
    #form = PersonAdminForm

    #def save_model(self, request, obj, form, change):
        #   obj.user = request.user
        #   obj.save()
    #   messages.add_message(request, messages.INFO, 'Text of message')


admin.site.register(Person, PersonAdmin)

#forms.py

from testapp.models import Person
from django import forms

class PersonAdminForm(forms.ModelForm):
    class Meta:
        model = Person

感谢朋友的回复, 我在这里添加了我的实际模型类。实际上我没有使用任何自定义表单或自定义验证。我只使用了 django 管理界面。但是我在模型类中添加了一个自定义 save() 方法。在那个 save() 方法中,我在编辑和添加案例时做了一些条件。 使用 save() 方法正确添加数据和编辑数据。但是条件错误的情况下我们没有选项重定向回管理模型类列表或带有错误消息的管理表单? 在我的示例中,我可以使用任何其他代码而不是 raise ValidationError("error test message")?。 raise ValidationError 给出 django 错误页面。如果我使用重定向或返回,则在不保存数据时也会给出“...添加成功”消息。

有机会吗?

我的代码...

class Asset(models.Model):
    -----code--------

    class Meta:
        verbose_name_plural= "Employees Assets"         

    def save(self, *args, **kwargs):
        ----- code------

    if self.pk is not None:
        ++++++++++ some code +++++++++++

        if self.hardware.hardware_status == 0 and edit_flag == 2:
            ++++++++++ some code +++++++++++
        elif self.hardware.hardware_status == 1 and edit_flag == 1:
            ++++++++++ some code +++++++++++
        elif (self.hardware.hardware_status == 0 or self.hardware.hardware_status == -1) and   edit_flag == 1:
            ++++++++++ some code +++++++++++    
        elif self.hardware.hardware_status == -1 and edit_flag == 2:
            raise ValidationError('Cant modify Hardware, Hardware status is Lost ')
        else:
            raise ValidationError('Cant modify Hardware, Hardware already assigned to other staff') 

        self.hardware.save()
            super(Asset, self).save(*args, **kwargs) 

    else:
        if self.hardware.hardware_status == 0:
            ++++++++++ some code +++++++++++        
        else:
            raise ValidationError(u'Can't assign, Hardware not available(Lost/Alreday Assigned) for assignment')

    self.hardware.save()
    super(Asset, self).save(*args, **kwargs)


    def  __unicode__(self):
        return u'%s Hardware information for %s' % (self.hardware, self.employee)

【问题讨论】:

【参考方案1】:

那是完全错误的地方。模型故意对请求一无所知。没有办法从保存方法重定向,你不应该尝试实现一个。您的视图负责运行验证和适当的重定向。

【讨论】:

请查看我编辑的问题。所以我在模型类 save() 方法中没有重定向选项。我只需要重定向回表单或在其他条件中列出而不是引发 ValidationError。 raise ValidationError 给出 django 错误页面。我希望重定向回表单或带有错误消息的列表。如果我使用返回或重定向在其他情况下也会给我“...添加成功” 我完全看不懂你的代码,但这就是正是为什么你应该在保存之前使用验证 - 可能是在表单中 - 而不是试图全部完成在保存方法中。 感谢 Dani,所以我相信,我们在模型类 save() 方法中没有重定向选项。让我尝试在形式上做,而不是在 save() 方法中。在我的代码模型类 save() 方法中,我尝试在某些情况下重定向回管理表单。谢谢【参考方案2】:

尝试在管理员中自定义验证:

forms.py:

class PersonAdminForm(forms.Form):
    class Meta:
    model = Person

    def clean_first_name(self):
        if self.first_name == "":value )
            raise ValidationError(u"Enter a valid name")
        else
            return self.clean_first_name["first_name"]

admin.py:

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name')]
    form = PersonAdminForm

查看此链接validation

【讨论】:

亲爱的我修改了我的问题,请看一下,我需要从我的模型 .class save() 方法中重定向/返回 else 条件【参考方案3】:

模型不做重定向。这意味着,在这里覆盖您的模型保存方法几乎没有用处。这是表单验证的一个非常直接的案例,因此,您必须在 forms.py 中使用以下内容

您的视图正在为您处理表单重定向,因此,只需在表单中编写代码即可。

【讨论】:

以上是关于在 Django 模型保存方法中需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用更多字段扩展用户模型的最佳方法是啥?

django - 在保存之前比较新旧字段值

如何让我的视图更好地保存 Django

Django Admin预先填写用户的电子邮件

Django 抽象父模型保存覆盖

在 Django 中,我无法保存模型的新内容