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 <kmtra...@gmail.com> wrote: > On Fri, Feb 27, 2009 at 11:46 AM, Michael Repucci <mich...@repucci.org>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 django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---