سؤال

أقوم بإضافة نظام لترك "إشعارات" للمستخدمين الذين يمكن عرضهم في المرة التالية التي يقومون فيها بتسجيل الدخول. قمت بإنشاء فئة إشعار بسيطة في ملف models.py. لدي فئة userInfo هذه (في نفس النماذج) لإضافة بعض السمات إلى نظام المستخدم الحالي في Django كجزء من SocialAuth:

class UserInfo(models.Model):
    user = models.OneToOneField(User, unique=True)
    ...
    reputation = models.IntegerField(null=True, blank=True)

    def add_notification(message):
        notification = Notification(user=self.user, message=message)
        notification.save

عندما أجربها في وحدة التحكم ، انتهى بي الأمر إلى هذا:

>>> user = User.objects.get(id=14)
>>> user.userinfo.add_notification('you are an awesome intern!')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: add_notification() takes exactly 1 argument (2 given)
>>> 

ماذا أفتقد هنا؟ أنا نوع من django noob ، لذلك ربما يكون الأمر سهلاً. شكرًا!

هل كانت مفيدة؟

المحلول

استخدم رسائل Django

أولاً ، يرجى النظر إجابة dcrodjer. نظام رسائل Django هو بالضبط ما تحتاجه ، ولماذا وضعت في شجرة الكود الخاصة بك شيء تحصل عليه مجانًا؟

(بالطبع ، إذا كنت تفعل هذا فقط للتجربة ومعرفة المزيد عن Django ، فيرجى المتابعة!)


على أي حال ، إصلاح

ملخص: لإصلاح هذا ، فقط قم بتغيير add_notifications الى هذا:

    def add_notification(self, message):
        notification = Notification(user=self.user, message=message)
        notification.save

لاحظ الوسيطة الإضافية (المسمى self) في توقيع الطريقة.


لماذا لا يعمل

هناك بعض الشيء من Quirk في أساليب الاتصال في بيثون.

class Foo(object):
    def bar(self):
        print 'Calling bar'

    def baz(self, shrubbery):
        print 'Calling baz'

thisguy = Foo()

عندما تتصل بالطريقة bar, ، يمكنك استخدام خط مثل thisguy.bar(). يرى Python أنك تتصل طريقة على كائن (طريقة تسمى bar على كائن يسمى thisguy). عندما يحدث هذا ، يملأ Python الوسيطة الأولى من الطريقة مع الكائن نفسه ( thisguy هدف).

السبب في أن طريقتك لا تنجح هو أنك تتصل userinfo.add_notification('you are an awesome intern!') على طريقة تتوقع فقط حجة واحدة. حسنًا ، لقد شغل بيثون بالفعل الحجة الأولى (المسمى message) مع ال userinfo هدف. وبالتالي ، يشكو بيثون من أنك تمرر وسيطتين إلى طريقة لا تتوقع سوى طريقة.

نصائح أخرى

استخدم إطار رسالة Django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
يمكنك وضع الرسائل المخزنة المستخدمة في قائمة الانتظار بمجرد تسجيل الدخول باستخدام هذا:

messages.add_message(request, messages.INFO, 'Hello world.')

add_notification هي طريقة في الفصل. هذا يعني أنه يتم تمرير مثيل الفصل بشكل ضمني كمعلمة أول. فصول في بيثون

جرب هذا بدلاً من ذلك:

class UserInfo(models.Model):
    ...
    def add_notification(self, message):
        ...

ربما يجب عليك تحديث سؤالك إذا كنت تبحث عن رسائل مستمرة. يمكن https://github.com/philomat/django-persistraft-messages هل يمكن أن تساعدك في حفظ وقت الترميز؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top