【发布时间】:2010-12-22 01:41:19
【问题描述】:
如果有人能帮我解决我的编码问题,我将非常非常感激。当我在管理界面中时,不会产生任何错误。但是,当我在管理界面下为 Provider 对象单击“保存”时,我在自定义 save_model(...) 函数下指定的任何内容似乎都没有执行。我已经将我的代码压缩成小快照。 我做错了什么?
旁注:这听起来可能很奇怪,但我也在尝试在保存过程中删除该对象(在这样做之前它应该覆盖另一个“提供者”对象)。
====================
model.py
#models.py
...
class Provider(models.Model):
title = models.CharField(max_length=150)
purpose = models.TextField()
summary = models.TextField()
email = models.EmailField()
access_code = models.CharField(max_length=30, default=random_password)
verified = models.BooleanField(default=False) #On/Off switch to display on database
flagged = models.BooleanField(default=False)
revised = models.BooleanField(verbose_name = "New Update", default=False)
# Will be True, if a revision has occured
# On/Off switch state whether this is a revision of an existing Provider
# This will be useful for creating a manager that lists updated providers
# Note: Must delete Revised_Provider object after verification is complete
# and UPDATE has occurred on save()
#M2M Relations
serviced_location = models.ManyToManyField(Location, through='ServicedLocations')
services_offered = models.ManyToManyField(ServiceType, through='OfferedServices')
insurances_accepted = models.ManyToManyField(InsuranceProvider, through='AcceptedInsurances')
#contacts = models.ManyToManyField(Contact, blank=True)
def __unicode__(self):
return self.title
#Used for allow the provider to make change to their profile, and wait
#for verification before it will show up on regular search results
#Serves as a map for referencing a verified provider to a recent update (revision)
class Revision(models.Model): #Revised Providers (eg: Updated)
provider = models.ForeignKey(Provider, null=True)
date_revised = models.DateTimeField(auto_now=True, auto_now_add=True)
def __unicode__(self):
return u'%s' % self.provider
class ServicedLocations(models.Model):
location = models.ForeignKey(Location)
provider = models.ForeignKey(Provider) #Pre-Verified or Verified Settings
revision = models.ForeignKey(Revision, null=True, on_delete=models.SET_NULL)
...etc...
====================
admin.py
#admin.py
from django.contrib import admin
from django.forms.models import ModelForm
from django import forms
from health.providers.models import *
class ProviderAdminForm(forms.ModelForm):
def clean(self):
cleaned_data = self.cleaned_data
flagged = cleaned_data.get("flagged")
verified = cleaned_data.get("verified")
if flagged == True and verified == True:
raise forms.ValidationError("You cannot verify a 'flagged' provider. If you meant to verify this provider, be sure to uncheck 'flagged'")
# Just in case someone accidently verified a flagged provider
return cleaned_data
class ProviderAdmin(admin.ModelAdmin):
list_per_page = 100
list_display = ('date_added', 'title', 'state', 'verified', 'flagged')
list_display_links = ('title',)
list_filter = ('verified', 'flagged', 'revised')
search_fields = ['title',]
filter_horizontal = ('services_offered',)
form = ProviderAdminForm
def save_model(self, request, obj, form, change):
ProviderID = obj.id
try: #see if a revision exists in the table
Compare = Revision.objects.get(id=ProviderID)
OldProviderID = Compare.provider.id
OldProvider = Provider.objects.get(id=OldProviderID)
RevisedProvider = Provider.objects.get(id=ProviderID)
RevisedProviderID = RevisedProvider.id
if change: #Check to see if we changed anything important
verified = form.cleaned_data['verified']
#Means we would have had to manually verified it
if verified == True:
#This means that we have approved to update the old Provider
#After copying the data over, we destroy what we are saving
obj.revised = False
obj.save()
#If we verfied it, revised = False
OldProvider = RevisedProvider #Update Existing Provider Table
OldProvider.save()
NewLocations = ServicedLocations.objects.get(provider=RevisedProviderID)
OldLocations = ServicedLocations.objects.get(provider=OldProviderID)
OldLocations = NewLocations
OldLocations.save()
NewLocations.delete()
Compare.delete() #Delete from database
RevisedProvider.delete() #Delete Final Copy of Table
return HttpResponseRedirect("admin/providers/provider/%s/" % OldProviderID) #Redirect them to updated provider
except Revision.DoesNotExist:
print "This provider does not have any unverified revisions"
return super(ProviderAdmin, self).save_model(request, obj, form, change)
admin.site.register(Provider, ProviderAdmin)
【问题讨论】:
标签: django forms save admin verification