I am trying to fill in the DB table ” Notification ” through a function as follows :
My models :
class NotificationType(models.Model):
type = models.CharField(max_length = 100)
application = models.CharField(max_length = 100)
description = models.CharField(max_length = 1000 , null = True)
class NotificationContent(models.Model):
link_id = models.IntegerField()
unique_content = models.CharField(max_length = 500)
class Notification(models.Model):
person = models.ForeignKey(User)
content_id = models.ForeignKey(NotificationContent)
notification_type_id = models.ForeignKey(NotificationType)
datetime = models.DateTimeField(auto_now_add = True)
is_active = models.BooleanField(default = 1)
read_unread = models.BooleanField( default = 0 )
and am using the function send_as_notification_to() in other app view as :
def crave_form(request):
if request.method == 'POST':
form = IcraveForm(request.POST)
if form.is_valid():
crave = form.save(commit = False)
crave.person = request.user
crave.save()
send_as_notification_to( crave.person , crave.id , crave.person , 'icrave' , 'crave' )
else:
form = IcraveForm()
return render(request, 'icrave/form.html', { 'form' : form})
function definition :
def send_as_notification_to(person , link_id , unique_content , which_app, notification_type ):
notification = Notification(person = person)
notification.content_id.link_id = link_id
notification.content_id.unique_content = unique_content
notification.notification_type_id.type = notification_type
notification.notification_type_id.application = which_app
Traceback :
Environment:
Request Method: POST
Request URL: http://localhost:8000/icrave/create/
Django Version: 1.3
Python Version: 2.7.1
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.comments',
'ec.kiosk',
'ec.chakra',
'ec.ajax',
'ec.broadcast',
'ec.connect',
'ec.seek',
'ec.feed',
'ec.ec_model',
'ec.info',
'ec.domains',
'ec.souk',
'ec.meta',
'ec.shastra',
'ec.chat',
'ec.log',
'ec.icrave',
'ec.notification',
'django.contrib.admin']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Volumes/Disk2/workspace/ec/ec/icrave/views.py" in crave_form
16. send_as_notification_to( crave.person , crave.id , crave.person , 'icrave' , 'crave' )
File "/Volumes/Disk2/workspace/ec/ec/notification/api.py" in send_as_notification_to
6. notification.content_id.link_id = link_id
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py" in __get__
301. raise self.field.rel.to.DoesNotExist
Exception Type: DoesNotExist at /icrave/create/
Exception Value:
In your send_as_notification_to function you need to assign a NotificationContent instance to the content_id value of your Notification instance:
The same will have to be done for NotificationType on Notification.
One piece of advice I’d like to give you:
The fields that you’ve named with _id on the end (e.g. content_id, notification_type_id) are not storing the id’s, they are pointers to the actual objects!!! This means that not only will that model have those fields, but django should (I think) also create the following two fields, which actually do point to the id’s of the objects in question: content_id_id, notification_type_id_id.
Very bad, you should just name it after the Model itself, so: content, notification_type.