需要帮助Django Model保存方法

时间:2014-07-30 17:34:07

标签: django django-models

需要Django模型save()方法的帮助。 如果我的模型save()方法的某些条件为false,我需要重定向回Person列表页面或Person表单。 目前我使用了验证错误,但我正在寻找重定向回列表页面或表单。如果我使用return语句,总是成功添加而不保存。 在这里,我需要一个重定向而不是"引发ValidationError(u"输入一个有效的名称")。

先谢谢 贾斯汀

#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()方法添加数据和编辑数据。但条件错误的情况我们没有选项重定向回管理模型类列表或管理表单错误消息? 在我的示例中,我可以使用任何其他代码而不是引发ValidationError("错误测试消息")?提出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)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

尝试在admin中自定义验证:

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

答案 2 :(得分:0)

模型没有重定向。这意味着,覆盖模型保存方法在这里几乎没用。这是表单验证的直接情况,因此,您必须在forms.py

中使用以下内容

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