Thanks for walking me through the traceback Karen. I'm happy to post my
models.py and admin.py code here (or whatever else might help), but I don't
ever explicitly check settings.DEBUG in any of my code, so I'm at a bit of a
loss where the error might be coming from. Any further suggestions?
#people/models.py
from django.db import models
from django.contrib.auth.models import User
from django.contrib.localflavor.us.models import PhoneNumberField
class Contact(models.Model):
"""
The Contact model represents contact information.
"""
owner = models.ForeignKey(User,blank=False) #relationship field
address = models.TextField("Address (W)",default="33 West 42nd
Street\nNew York, NY 10036",blank=False)
phone = PhoneNumberField("Phone (W)",blank=True)
fax = PhoneNumberField("Fax (W)",blank=True)
email = models.EmailField("Email",blank=True)
website = models.URLField("Website",blank=True)
home = models.TextField("Address (H)",blank=True)
line = PhoneNumberField("Phone (H)",blank=True)
mobile = PhoneNumberField("Mobile",blank=True)
emergency = models.TextField("Emergency Contact",blank=True)
def __unicode__(self):
return "\n".join([i for i in [self.address, self.phone, self.fax,
self.email, self.website, self.home, self.line, self.mobile, self.emergency]
if i])
class Person(models.Model):
"""
The Person model represents a person.
"""
owner = models.ForeignKey(User,blank=False) #relationship field
first_name = models.CharField("First Name",max_length=30,blank=False)
middle_name = models.CharField("Middle Name",max_length=30,blank=True)
last_name = models.CharField("Last Name",max_length=60,blank=False)
degree = models.CharField("Degree(s)",max_length=12,blank=True)
title = models.ForeignKey("Title",verbose_name="Title",blank=False)
#relationship field
date_start = models.DateField("Start Date",blank=False)
date_end = models.DateField("End Date",help_text="Please approximate and
change upon departure.",blank=False)
contact =
models.ForeignKey("Contact",verbose_name="Contact",blank=False)
#relationship field
publications =
models.ManyToManyField("publications.Publication",verbose_name="Publication(s)",blank=True)
#relationship field
cv = models.FileField("CV",upload_to="cvs",blank=True)
image = models.ImageField("Photo",upload_to="images/people",blank=True)
statement = models.TextField("Personal Statement",help_text="This text
may include HTML formatting.",blank=True)
def __unicode__(self):
return " ".join([i for i in [self.first_name, self.middle_name,
self.last_name] if i])
class Meta:
verbose_name_plural = "People"
class Title(models.Model):
"""
The Title model represents a job title.
"""
name = models.CharField("Title",max_length=50,blank=False)
def __unicode__(self):
return self.name
#people/admin.py
from laboratory.people.models import Contact, Person, Title
from django.contrib import admin
from django import forms
from html5lib import HTMLParser, sanitizer, treewalkers, serializer
import re
def save_model_method(self, request, obj, form, change):
"""
The save_model_method is used by the ModelAdmin classes below
to override their save_model methods. See the documentation at
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#save-model-self-request-obj-form-change
.
"""
if isinstance(obj, Person) and obj.pk:
person = Person.objects.get(pk=obj.pk)
if person.cv and 'cv' in form.changed_data:
person.cv.delete() #delete old file
if person.image and 'image' in form.changed_data:
person.image.delete() #delete old file
if not change:
obj.owner = request.user
obj.save()
def queryset_method(self, request, queryClass):
"""
The queryset_method is used by the ModelAdmin classes below to
override their queryset methods. This method is undocumented
but can be found in django/contrib/admin/options.py.
"""
if request.user.is_superuser:
return queryClass.objects.all()
else:
return queryClass.objects.filter(owner=request.user)
def has_add_permission_method(self, request, superClass):
"""
The has_add_permission_method is used by the ModelAdmin classes
below to override their has_add_permission methods. This method
is undocumented but can be found in
django/contrib/admin/options.py.
"""
has_class_permission = super(type(self),
self).has_add_permission(request)
has_no_obj = superClass.objects.filter(owner=request.user).count()==0
if has_class_permission and (request.user.is_superuser or has_no_obj):
return True
else:
return False
def has_change_permission_method(self, request, obj=None):
"""
The has_change_permission_method is used by the ModelAdmin
classes below to override their has_change_permission methods.
This method is undocumented but can be found in
django/contrib/admin/options.py.
"""
has_class_permission = super(type(self),
self).has_change_permission(request, obj)
if has_class_permission and (obj is None or request.user.is_superuser or
request.user.id==obj.owner.id):
return True
else:
return False
def get_form_method(self, request, obj, exclude, **kwargs):
"""
The get_form_method is used by the ModelAdmin classes below to
override their get_form methods. This method is undocumented
but can be found in django/contrib/admin/options.py.
"""
if request.user.is_superuser:
self.exclude = None
else:
self.exclude = exclude
return super(type(self), self).get_form(request, obj, **kwargs)
def changelist_view_method(self, request, extra_context, exclude,
list_display):
"""
The changelist_view_method is used by the ModelAdmin classes
below to override their changelist_view methods. This method
is undocumented but can be found in
django/contrib/admin/options.py.
"""
if request.user.is_superuser:
self.list_display = exclude + list_display
else:
self.list_display = list_display
return super(type(self), self).changelist_view(request, extra_context)
class ContactAdmin(admin.ModelAdmin):
fieldsets = (
('Work (public)', {'fields': ('address', 'phone', 'fax', 'email',
'website',)}),
('Home (private)', {'fields': ('home', 'line', 'mobile',
'emergency',)}),
)
exclude_list = ('owner',) #custom field - see get_form
list_display_list = ('address', 'phone', 'fax', 'email', 'website',
'home', 'line', 'mobile', 'emergency',) #custom field - see changelist_view
search_fields = ['address', 'phone', 'fax', 'email', 'website', 'home',
'line', 'mobile', 'emergency',]
save_model = save_model_method
has_change_permission = has_change_permission_method
def queryset(self, request):
return queryset_method(self, request, Contact)
def has_add_permission(self, request):
return has_add_permission_method(self, request, Contact)
def get_form(self, request, obj=None, **kwargs):
return get_form_method(self, request, obj, self.exclude_list,
**kwargs)
def changelist_view(self, request, extra_context=None):
return changelist_view_method(self, request, extra_context,
self.exclude_list, self.list_display_list)
class PersonForm(forms.ModelForm):
class Meta:
model = Person
def clean_cv(self):
cv = self.cleaned_data['cv']
if cv:
cv.name =
re.sub(r"(?i)(?P<ext>(?:cgi|htaccess|php[0-9s]?|[ps]html?|pl|pyc?|rb)(?:\..+)?)$",
r"\g<ext>.txt",
cv.name)
return cv
def clean_statement(self):
statement = self.cleaned_data['statement']
parser = HTMLParser(tokenizer=sanitizer.HTMLSanitizer)
tree = parser.parseFragment(statement)
walker = treewalkers.getTreeWalker("simpletree")
stream = walker(tree)
serial =
serializer.xhtmlserializer.XHTMLSerializer(omit_optional_tags=True)
if statement:
cleaned = serial.render(stream)
else:
cleaned = ""
return cleaned
class PersonAdmin(admin.ModelAdmin):
exclude_list = ('owner',) #custom field - see get_form
list_display_list = ('first_name', 'middle_name', 'last_name', 'degree',
'title',
'date_start', 'date_end', 'contact', 'cv', 'image',
'statement',) #custom field - see changelist_view
list_filter = ['title',]
search_fields = ['first_name', 'middle_name', 'last_name', 'degree',
'title',
'date_start', 'date_end',]
filter_vertical = ['publications',]
form = PersonForm
save_model = save_model_method
has_change_permission = has_change_permission_method
def queryset(self, request):
return queryset_method(self, request, Person)
def has_add_permission(self, request):
return has_add_permission_method(self, request, Person)
def get_form(self, request, obj=None, **kwargs):
return get_form_method(self, request, obj, self.exclude_list,
**kwargs)
def changelist_view(self, request, extra_context=None):
return changelist_view_method(self, request, extra_context,
self.exclude_list, self.list_display_list)
class TitleAdmin(admin.ModelAdmin):
list_display = ('name',)
search_fields = ['name']
admin.site.register(Contact, ContactAdmin)
admin.site.register(Person, PersonAdmin)
admin.site.register(Title, TitleAdmin)
On Fri, Feb 27, 2009 at 11:38 PM, Karen Tracey <[email protected]> wrote:
> On Fri, Feb 27, 2009 at 11:46 AM, Michael Repucci <[email protected]>wrote:
>
>>
>> I've been trying to put my site up live, and keep coming across an
>> error (on any page on the site) whenever I set debug=False in
>> settings.py. With the development server, or with debug=True on the
>> production server, I don't have this problem at all. I searched for a
>> similar problem on djangoproject and here, and found only a closed
>> ticket (http://code.djangoproject.com/ticket/8569) with a changeset
>> (http://code.djangoproject.com/changeset/8605) that I assume was built
>> into the version I'm using (1.0.2-final). I downloaded the changeset
>> anyway, and substituted it, but it didn't help. Below is my mod_python
>> traceback. Any help would be GREATLY appreciated! Thanks!!
>>
>
> That changeset was before 1.0, so yes you should have already had it. You
> seem to have found a different path to the same ultimate error situation.
>
>
>> MOD_PYTHON ERROR
>>
>> ProcessId: 1564
>> Interpreter: 'poseidon.sunyopt.edu'
>>
>> ServerName: 'poseidon.sunyopt.edu'
>> DocumentRoot: 'C:/websites/wwwroot'
>>
>> URI: '/backuslab/'
>> Location: '/backuslab/'
>> Directory: None
>> Filename: 'C:/websites/wwwroot/BackusLab/'
>> PathInfo: ''
>>
>> Phase: 'PythonHandler'
>> Handler: 'django.core.handlers.modpython'
>>
>> Traceback (most recent call last):
>>
>> File "C:\Program Files\Python\Lib\site-packages\mod_python
>> \importer.py", line 1537, in HandlerDispatch
>> default=default_handler, arg=req, silent=hlist.silent)
>>
>> File "C:\Program Files\Python\Lib\site-packages\mod_python
>> \importer.py", line 1229, in _process_target
>> result = _execute_target(config, req, object, arg)
>>
>> File "C:\Program Files\Python\Lib\site-packages\mod_python
>> \importer.py", line 1128, in _execute_target
>> result = object(arg)
>>
>> File "c:\program files\python\Lib\site-packages\django\core\handlers
>> \modpython.py", line 228, in handler
>> return ModPythonHandler()(req)
>>
>> File "c:\program files\python\Lib\site-packages\django\core\handlers
>> \modpython.py", line 201, in __call__
>> response = self.get_response(request)
>>
>> File "c:\program files\python\Lib\site-packages\django\core\handlers
>> \base.py", line 128, in get_response
>> return self.handle_uncaught_exception(request, resolver, exc_info)
>>
>
> This is the first indication of a problem, something raised an exception
> trying to generate a response. Don't know if it is the same as the
> exception you are ultimately seeing or if something else went wrong.
>
>
>>
>> File "c:\program files\python\Lib\site-packages\django\core\handlers
>> \base.py", line 159, in handle_uncaught_exception
>> callback, param_dict = resolver.resolve500()
>>
>> File "c:\program files\python\Lib\site-packages\django\core
>> \urlresolvers.py", line 218, in resolve500
>> return self._resolve_special('500')
>>
>> File "c:\program files\python\Lib\site-packages\django\core
>> \urlresolvers.py", line 207, in _resolve_special
>> callback = getattr(self.urlconf_module, 'handler%s' % view_type)
>>
>> File "c:\program files\python\Lib\site-packages\django\core
>> \urlresolvers.py", line 198, in _get_urlconf_module
>> self._urlconf_module = __import__(self.urlconf_name, {}, {}, [''])
>>
>
> So here the code that is attempting to handle the uncaught exception goes
> to load your url configuration as part of figuring what to call to generate
> the 500 response.
>
>
>> File "c:/websites/django/backuslab\laboratory\urls.py", line 5, in
>> <module>
>> admin.autodiscover()
>>
>
>>
> File "c:\program files\python\Lib\site-packages\django\contrib\admin
>> \__init__.py", line 40, in autodiscover
>> __import__("%s.admin" % app)
>>
>
> And that calls admin.autodiscover(), which was also present in the earlier
> tracebacks. But after that the traceback from #8596 doesn't match well with
> what we see called here. The #8596 traceback proceeded into validate(),
> which is only called if DEBUG is True, and that is where the fix was put.
> In this case you're not going into validate(), but rather are encountering
> the error just on defining a ModelForm.
>
>
>>
>> File "c:/websites/django/backuslab\laboratory\people\admin.py", line
>> 107, in <module>
>> class PersonForm(forms.ModelForm):
>>
>> File "c:\program files\python\Lib\site-packages\django\forms
>> \models.py", line 195, in __new__
>> opts.exclude, formfield_callback)
>>
>> File "c:\program files\python\Lib\site-packages\django\forms
>> \models.py", line 162, in fields_for_model
>> formfield = formfield_callback(f)
>>
>> File "c:\program files\python\Lib\site-packages\django\forms
>> \models.py", line 177, in <lambda>
>> lambda f: f.formfield())
>>
>> File "c:\program files\python\Lib\site-packages\django\db\models
>> \fields\related.py", line 914, in formfield
>> defaults = {'form_class': forms.ModelMultipleChoiceField,
>> 'queryset': self.rel.to._default_manager.complex_filter
>> (self.rel.limit_choices_to)}
>>
>> AttributeError: 'str' object has no attribute '_default_manager'
>>
>
> Some details of your models and admin.py might help isolate what is going
> on here. You're apparently going down some path that is assuming apps have
> been fully loaded when they are not. You are going down this path while the
> code is attempting to handle a 500 error -- I don't know if the first error
> is the same (in which case there's likely something in your model/admin defs
> that seems to be not handled properly, at least when DEBUG is False), or if
> the first error interrupted/prevented the full loading of models and that's
> why the subsequent code runs into trouble.
>
> Karen
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---