如何将禁用用户添加到表格,并将详细信息发送到Django Admin

时间:2018-05-10 03:46:22

标签: python django django-models django-admin django-email

我有一个简单的禁止功能,可以将用户设置为false,并使用基本的电子邮件功能发送电子邮件。我正在使用的表格是UserProfileReport& Banned_User表。

我期待:

  1. 将用户ProfileReason_reportedReport表和datetime添加到禁止的Banned_User表中。
  2. 将这些详细信息发送给用户电子邮件
  3. 目前我正在接受 Attribute Error at /admin/api/profile/: WSGIRequest' object has no attribute 'report'' 并且不确定如何做这两件事。

    def banning_users(self, request, queryset):
    
    for obj in queryset:
        if hasattr(obj, 'user'):
            # This object is a Profile, so lookup the user
            obj = obj.user
        obj.is_active = False
    
        #email function
        banned_user = Banned_User.objects.create(profile=request.user.profile, report_reasons=request.report.report_reason)
        banned_user.save()
        #Sends ban email to user,does not send through the variables yet
        subject = 'Ban'
        message =   'You have been banned'
        email_from = settings.EMAIL_HOST_USER
        recipient_list = [obj.email]
        send_mail( subject, message,email_from, recipient_list )
        obj.save()
    
    
    self.message_user(request, "User is banned and Email has been sent")
    

    表格如下:

    报告表

    class Report(models.Model):
    def __str__(self):
        return str.join(str(self.user_reported), str(self.datetime_sent))
    
    TOXICITY = 'Toxicity'
    SPORTSMANSHIP = 'Poor sportsmanship'
    
    REPORT_REASON_CHOICES = (
        (TOXICITY, 'Toxicity'),
        (SPORTSMANSHIP, 'Unsportsmanlike Behaviour'),
    )
    
    session = models.ForeignKey(
        'Session',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
    )
    
    user_reported = models.ForeignKey(
        'Profile',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
        related_name='user_reported_report',
    )
    
    sent_by = models.ForeignKey(
        'Profile',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
        related_name='sent_by_report',
    )
    
    report_reason = models.CharField(
        max_length=255,
        choices=REPORT_REASON_CHOICES,
        default=TOXICITY,
    )
    
    datetime_sent = models.DateTimeField(auto_now_add=True,)
    

    禁止用户表

    class Banned_User(models.Model):
    def __str__(self):
        return self.user.get_username
    
    profile = models.ForeignKey(
        'Profile',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
        related_name='banned_profile'
    )
    
    report_reason = models.ForeignKey(
        'Report',
        on_delete=models.PROTECT,
        blank=True,
        null=True,
    )
    
    date_banned = models.DateField(null=True, blank=False,)
    

    配置文件:

    class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT)
    
    def __str__(self):
        return self.user.username
    
    USWEST = 'US-West'
    USEAST = 'US-East'
    EUROPE = 'Europe'
    OCEANIA = 'Oceania'
    ASIA = 'Asia'
    SOUTHAMERICA = 'South America'
    SOUTHAFRICA = 'South Africa'
    MIDDLEEAST = 'Middle-East'
    
    PREF_SERVER_CHOICES = (
        (USWEST, 'US-West'),
        (USEAST, 'US-East'),
        (EUROPE, 'Europe'),
        (OCEANIA, 'Oceania'),
        (ASIA, 'Asia'),
        (SOUTHAMERICA, 'South America'),
        (SOUTHAFRICA, 'South Africa'),
        (MIDDLEEAST, 'Middle-East'),
    )
    
    pref_server = models.CharField(
        max_length=20,
        choices=PREF_SERVER_CHOICES,
        default=USWEST,
    )
    
    TEAMWORK = 'Teamwork'
    COMMUNICATION = 'Communication'
    SKILL = 'Skill'
    SPORTSMANSHIP = 'Sportsmanship'
    
    COMMENDS_CHOICES = (
        (TEAMWORK, 'Teamwork'),
        (COMMUNICATION, 'Communication'),
        (SKILL, 'Skill'),
        (SPORTSMANSHIP, 'Sportsmanship'),
    )
    teamwork_commends = models.IntegerField(null=False, blank=False, default='0',)
    communication_commends = models.IntegerField(null=False, blank=False, default='0',)
    skill_commends = models.IntegerField(null=False, blank=False, default='0',)
    sportsmanship_commends = models.IntegerField(null=False, blank=False, default='0',)
    
    # Weighting of commends
    commend_priority_1 = models.CharField(null=False, blank=False, max_length=20, default=TEAMWORK, choices=COMMENDS_CHOICES,)
    commend_priority_2 = models.CharField(null=False, blank=False, max_length=20, default=COMMUNICATION, choices=COMMENDS_CHOICES,)
    commend_priority_3 = models.CharField(null=False, blank=False, max_length=20, default=SKILL, choices=COMMENDS_CHOICES,)
    commend_priority_4 = models.CharField(null=False, blank=False, max_length=20, default=SPORTSMANSHIP, choices=COMMENDS_CHOICES,)
    
    # Other details
    birth_date = models.DateField(null=True, blank=False,)
    sessions_played = models.IntegerField(null=False, blank=False, default=0,)
    received_ratings = models.IntegerField(null=False, blank=False, default=0,)
    in_queue = models.BooleanField(null=False, blank=False, default=False,)
    
    # The users id on discord, which will never change. Current max length is 19, but set to 20 for safe measure (64bit Integer)
    discord_id = models.CharField(max_length=20, null=True, blank=True,)
    

    TRACEBACK:

    AttributeError at /admin/api/profile/
    
    'WSGIRequest' object has no attribute 'report'
    
    Request Method:     POST
    Request URL:    http://127.0.0.1/admin/api/profile/
    Django Version:     2.0.5
    Exception Type:     AttributeError
    Exception Value:    
    
    'WSGIRequest' object has no attribute 'report'
    
    Exception Location:     /home/mihir/Capstone-Project/siteroot/apps/api/admin.py in banning_users, line 31
    Python Executable:  /usr/bin/python3.6
    Python Version:     3.6.5
    Python Path:    
    
    ['/home/mihir/Capstone-Project/siteroot',
     '/usr/lib/python36.zip',
     '/usr/lib/python3.6',
     '/usr/lib/python3.6/lib-dynload',
     '/usr/local/lib/python3.6/dist-packages',
     '/usr/lib/python3/dist-packages',
     '/var/www/CapstoneProject/siteroot',
     '/var/www/CapstoneProject/siteroot/mysite']
    
    Server time:    Thu, 10 May 2018 03:36:51 +0000
    

    新代码:

        def banning_users(self, request, queryset):
    
        for obj in queryset:
            if hasattr(obj, 'user'):
                # This object is a Profile, so lookup the user
                obj = obj.user
            obj.is_active = False
    
            banned_user = Banned_User.objects.create(profile=request.user.profile)
            banned_user.report_reason.add(request.user.profile.user_reported_report.all())
            banned_user.save()
            #Sends ban email to user,does not send through the variables yet
            subject = 'Ban'
            message =   'You have been banned for being trash'
            email_from = settings.EMAIL_HOST_USER
            recipient_list = [obj.email]
            send_mail( subject, message,email_from, recipient_list )
            obj.save()
    

3 个答案:

答案 0 :(得分:2)

  

我期待:

     
      
  1. 将用户个人资料,从报告表格中的Reason_reported和禁止他们的日期时间添加到禁止的Banned_User表格中。

  2.   
  3. 将这些详细信息发送给用户电子邮件

  4.   

将问题归结为实际问题,首先要创建禁止报告,然后添加用户,最后发送电子邮件。

错误消息告诉您report对象没有request属性,这是有道理的,因为它与用户绑定了报告,而不是请求。

def banning_users(self, request, queryset):

    for obj in queryset:
        if hasattr(obj, 'user'):
            # This object is a Profile, so lookup the user
            profile = obj
            user = obj.user
        user.is_active = False

        # Get the report(s) for this user
        user_reports = Report.objects.filter(user_reported=profile)

        # Go through each report, in case there are multiples,
        # add a record in the ban table

        banned_reasons = []

        for report in user_reports:
            ban_record = Banned_User.create(profile=profile, report_reason=report, date_banned=datetime.datetime.today())
            banned_reasons.append(report.get_report_reason_display())

        # Send the email
        subject = 'Ban'
        message = 'You have been banned for the following reasons: {}'
        message.format(','.join(banned_reasons))
        email_from = settings.EMAIL_HOST_USER
        recipient_list = [user.email]
        send_mail( subject, message,email_from, recipient_list)

    self.message_user(request, "User is banned and Email has been sent")

答案 1 :(得分:1)

问题来自这一行:

banned_user = Banned_User.objects.create(profile=request.user.profile, 
           report_reasons=request.report.report_reason)

您正在尝试访问请求中的报告,而请求没有此属性。

我建议您将ForeignKey更改为ManyToManyField,因为用户可以有多个报告。

class Banned_User(models.Model):
    def __str__(self):
        return self.user.get_username

    profile = models.ForeignKey('Profile',on_delete=models.PROTECT,
         blank=False, null=False, related_name='banned_profile',)

    report_reasons = models.ManyToManyField('Report',blank=True)

所以你会有这个:

if hasattr(obj, 'user'):
    # This object is a Profile, so lookup the user
    obj = obj.user
obj.is_active = False

# email function
banned_user = Banned_User.objects.create(profile=request.user.profile)
banned_user.report_reasons.add(request.user.profile.user_reported_report.all())
# rest of code 

答案 2 :(得分:0)

This is the code that finally got it working :) thanks everyone for the help


def banning_users(self, request, queryset):

for obj in queryset:
    if hasattr(obj, 'user'):
        # This object is a Profile, so lookup the user
        profile = obj
        user = obj.user
    user.is_active = False
    user.save()

    banned_reasons = []


    banned_user = profile.banned_profile.create(profile=profile)
    reports = banned_user.profile.user_reported_report.all()
    banned_user.save()
    for report in reports:
        banned_user.report_reason.add(report)

    # Send the email
    subject = 'Ban'
    message = 'You have been banned for the following reasons: []'
    email_from = settings.EMAIL_HOST_USER
    recipient_list = [user.email]
    send_mail( subject, message,email_from, recipient_list)

self.message_user(request, "User is banned and Email has been sent")