Django Umleitung nicht funktioniert
-
10-07-2019 - |
Frage
Ich kann das Problem sehen, die ich meinen Code und Fehlerseite angebracht ist.
In meiner Vorlage, die ich habe:
{% if user.get_profile.is_store %}
<!--DO SOME LOGIC-->
{%endif%}
Aus meiner Sicht habe ich:
def downloads(request):
"""
Downloads page, a user facing page for the trade members to downloads POS etc
"""
if not authenticated_user(request):
return HttpResponseRedirect("/professional/")
if request.user.get_profile().is_store():
return HttpResponseRedirect("/")
user = request.user
account = user.get_profile()
downloads_list = TradeDownloads.objects.filter(online=1)[:6]
downloads_list[0].get_thumbnail()
data = {}
data['download_list'] = downloads_list
return render_to_response('downloads.html', data, RequestContext(request))
Umwelt:
Request Method: GET
Request URL: http://localhost:8000/professional/downloads
Django Version: 1.1.1
Python Version: 2.6.2
Installed Applications:
['django.contrib.auth',
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'sico.news',
'sico.store_locator',
'sico.css_switch',
'sico.professional',
'sico.contact',
'sico.shop',
'tinymce',
'captcha']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
Mein Fehlerbericht:
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
92. response = callback(request, *callback_args, **callback_kwargs)
File "/var/www/sico/src/sico/../sico/professional/views.py" in downloads
78. if request.user.get_profile().is_store():
File "/var/www/sico/src/sico/../sico/shop/models.py" in is_store
988. return not self.account is None
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/related.py" in __get__
191. rel_obj = self.related.model._base_manager.get(**params)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py" in get
120. return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in get
305. % self.model._meta.object_name)
Exception Type: DoesNotExist at /professional/downloads
Exception Value: Account matching query does not exist.
Meine BaseAccount Klasse
class BaseAccount(models.Model):
user = models.ForeignKey(User, unique=True)
def __unicode__(self):
"""
Return the unicode representation of this customer, which is the user's
full name, if set, otherwise, the user's username
"""
fn = self.user.get_full_name()
if fn:
return fn
return self.user.username
def user_name(self):
"""
Returns the full name of the related user object
"""
return self.user.get_full_name()
def email(self):
"""
Return the email address of the related user object
"""
return self.user.email
def is_store(self):
return not self.account is None
def is_professional(self):
return not self.professional is None
Ihr Konto CLASS`
lass Account(BaseAccount):
"""
The account is an extension of the Django user and serves as the profile
object in user.get_profile() for shop purchases and sessions
"""
telephone = models.CharField(max_length=32)
default_address = models.ForeignKey(Address, related_name='billing_account', blank=True, null=True)
security_question = models.ForeignKey(SecurityQuestion)
security_answer = models.CharField(max_length=200)
how_heard = models.CharField("How did you hear about us?", max_length=100)
feedback = models.TextField(blank=True)
opt_in = models.BooleanField("Subscribe to mailing list", help_text="Please tick here if you would like to receive updates from %s" % Site.objects.get_current().name)
temporary = models.BooleanField()
def has_placed_orders(self):
"""
Returns True if the user has placed at least one order, False otherwise
"""
return self.order_set.count() > 0
def get_last_order(self):
"""
Returns the latest order that this customer has placed. If no orders
have been placed, then None is returned
"""
try:
return self.order_set.all().order_by('-date')[0]
except IndexError:
return None
def get_currency(self):
"""
Get the currency for this customer. If global currencies are enabled
(settings.ENABLE_GLOBAL_CURRENCIES) then this function will return
the currency related to their default address, otherwise, it returns
the site default
"""
if settings.ENABLE_GLOBAL_CURRENCIES:
return self.default_address.country.currency
return Currency.get_default_currency()
currency = property(get_currency)
def get_gateway_currency(self):
"""
Get the currency that an order will be put through protx with. If protx
currencies are enabled (settings.ENABLE_PROTX_CURRENCIES), then the
currency will be the same returned by get_currency, otherwise, the
site default is used
"""
if settings.ENABLE_PROTX_CURRENCIES and settings.ENABLE_GLOBAL_CURRENCIES:
return self.currency
return Currency.get_default_currency()
gateway_currency = property(get_gateway_currency)
`
Lösung
self.account
zeigt auf einem nicht vorhandenen Account
Objekt, wenn es versucht, is_store()
zu verarbeiten. Ich würde vermuten, Sie eine Datenbank verwenden, die keine Fremdschlüssel * hust * MySQL * hust * erzwingen, und Ihre Daten wurden vermasselt.
Andere Tipps
Es sieht aus wie der user.get_profile () Rückgabewert ist leer, und deshalb schlägt es auf dem nächste is_store () Aufruf:
return not self.account is None
Das schlägt fehl, weil selbst leer ist (das heißt None).
[Bearbeiten] Nach der Lektüre dieser (unter Profilen) sieht es aus wie die Profil für diesen Benutzer nicht existiert und daher erhalten Sie die doesNotExist Ausnahme.
Es ist umleiten nicht, dass nicht erwerbsfähigen ist es Ihre is_store () Verfahren oder nicht vorhandenes Profil. Sie sollten prüfen, was genau self.account bezieht.
Soweit ich aus der Betrachtung Code sagen kann, haben Sie zwei Tabellen in Ihrer database- eines für baseaccount, die nur Benutzer-ID speichern und Konto, das alle Felder mit Konto + baseaccount ID zugeordnet speichert. Sie können versuchen, is_store mit so etwas zu ersetzen
def is_store(self):
try:
return self.account is None
except Account.DoesNotExist:
return False
Ich bin keineswegs ein Django-Experte, aber ich denke, das ist der Trick tun könnte.