Python ';WSGIRequest&x27;尝试基于登录用户的用户名创建模型对象时出错 目标

Python ';WSGIRequest&x27;尝试基于登录用户的用户名创建模型对象时出错 目标,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我正在尝试将报警.用户名设置为当前登录的用户的用户名。问题与相同,尽管我的代码有点不同,因为我提取了每个报警对象的位置详细信息 如何以及在何处集成代码中的行:username=User.objects.get(username=self.request.username) 错误 代码 型号.py class User(models.Model): """ Model representing each User """ username = models.CharField(ma

我正在尝试将
报警.用户名
设置为当前登录的
用户的用户名
。问题与相同,尽管我的代码有点不同,因为我提取了每个
报警
对象的位置详细信息

如何以及在何处集成代码中的行:
username=User.objects.get(username=self.request.username)

错误 代码 型号.py

class User(models.Model):
    """ Model representing each User """
    username = models.CharField(max_length=20, unique=True)
    password = models.CharField(max_length=30, validators=[MinLengthValidator(8)])
    email = models.EmailField(max_length=254)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)


class Alarm(models.Model):
    """ Model representing each Alarm """
    alarm_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.ForeignKey(User, on_delete=models.CASCADE, null=True)         # null=True is TEMP
    timezone = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    time = models.DateTimeField()
    temp_conditional = models.BooleanField()
    surf_conditional = models.BooleanField()
    temp_max = models.FloatField(blank=True, null=True)
    temp_min = models.FloatField(blank=True, null=True)
    surf_max = models.FloatField(blank=True, null=True)
    surf_min = models.FloatField(blank=True, null=True)
class SetAlarmForm(ModelForm):
    ...    
    class Meta:
        model = Alarm
        exclude = ['username', 'timezone', 'city', 'country']
class AlarmCreateView(LoginRequiredMixin, CreateView):
    model = Alarm
    form_class = SetAlarmForm
    template_name = 'weather_alarm/set_alarm.html'
    success_url = reverse_lazy('weather_alarm:confirm-alarm')
    login_url = "/login/"

    def form_valid(self, form):
        self.get_user_location(form)
        return super().form_valid(form)

    def get_user_location(self, form):
        """ Function to get User's location from IP and create Alarm object """
        ...
        alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            username=User.objects.get(username=self.request.username),
            timezone=user_timezone,
            city=location.raw['address']['city'],
            country=location.raw['address']['country'],
            time=form.cleaned_data['time'].astimezone(pytz.timezone(user_timezone)),
            temp_conditional=form.cleaned_data['temp_conditional'],
            surf_conditional=form.cleaned_data['surf_conditional'],
            temp_max=form.cleaned_data['temp_max'],
            temp_min=form.cleaned_data['temp_min'],
            surf_max=form.cleaned_data['surf_max'],
            surf_min=form.cleaned_data['surf_min'],
        )
        alarm_object.save()
Forms.py

class User(models.Model):
    """ Model representing each User """
    username = models.CharField(max_length=20, unique=True)
    password = models.CharField(max_length=30, validators=[MinLengthValidator(8)])
    email = models.EmailField(max_length=254)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)


class Alarm(models.Model):
    """ Model representing each Alarm """
    alarm_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.ForeignKey(User, on_delete=models.CASCADE, null=True)         # null=True is TEMP
    timezone = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    time = models.DateTimeField()
    temp_conditional = models.BooleanField()
    surf_conditional = models.BooleanField()
    temp_max = models.FloatField(blank=True, null=True)
    temp_min = models.FloatField(blank=True, null=True)
    surf_max = models.FloatField(blank=True, null=True)
    surf_min = models.FloatField(blank=True, null=True)
class SetAlarmForm(ModelForm):
    ...    
    class Meta:
        model = Alarm
        exclude = ['username', 'timezone', 'city', 'country']
class AlarmCreateView(LoginRequiredMixin, CreateView):
    model = Alarm
    form_class = SetAlarmForm
    template_name = 'weather_alarm/set_alarm.html'
    success_url = reverse_lazy('weather_alarm:confirm-alarm')
    login_url = "/login/"

    def form_valid(self, form):
        self.get_user_location(form)
        return super().form_valid(form)

    def get_user_location(self, form):
        """ Function to get User's location from IP and create Alarm object """
        ...
        alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            username=User.objects.get(username=self.request.username),
            timezone=user_timezone,
            city=location.raw['address']['city'],
            country=location.raw['address']['country'],
            time=form.cleaned_data['time'].astimezone(pytz.timezone(user_timezone)),
            temp_conditional=form.cleaned_data['temp_conditional'],
            surf_conditional=form.cleaned_data['surf_conditional'],
            temp_max=form.cleaned_data['temp_max'],
            temp_min=form.cleaned_data['temp_min'],
            surf_max=form.cleaned_data['surf_max'],
            surf_min=form.cleaned_data['surf_min'],
        )
        alarm_object.save()
视图.py

class User(models.Model):
    """ Model representing each User """
    username = models.CharField(max_length=20, unique=True)
    password = models.CharField(max_length=30, validators=[MinLengthValidator(8)])
    email = models.EmailField(max_length=254)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)


class Alarm(models.Model):
    """ Model representing each Alarm """
    alarm_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.ForeignKey(User, on_delete=models.CASCADE, null=True)         # null=True is TEMP
    timezone = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    time = models.DateTimeField()
    temp_conditional = models.BooleanField()
    surf_conditional = models.BooleanField()
    temp_max = models.FloatField(blank=True, null=True)
    temp_min = models.FloatField(blank=True, null=True)
    surf_max = models.FloatField(blank=True, null=True)
    surf_min = models.FloatField(blank=True, null=True)
class SetAlarmForm(ModelForm):
    ...    
    class Meta:
        model = Alarm
        exclude = ['username', 'timezone', 'city', 'country']
class AlarmCreateView(LoginRequiredMixin, CreateView):
    model = Alarm
    form_class = SetAlarmForm
    template_name = 'weather_alarm/set_alarm.html'
    success_url = reverse_lazy('weather_alarm:confirm-alarm')
    login_url = "/login/"

    def form_valid(self, form):
        self.get_user_location(form)
        return super().form_valid(form)

    def get_user_location(self, form):
        """ Function to get User's location from IP and create Alarm object """
        ...
        alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            username=User.objects.get(username=self.request.username),
            timezone=user_timezone,
            city=location.raw['address']['city'],
            country=location.raw['address']['country'],
            time=form.cleaned_data['time'].astimezone(pytz.timezone(user_timezone)),
            temp_conditional=form.cleaned_data['temp_conditional'],
            surf_conditional=form.cleaned_data['surf_conditional'],
            temp_max=form.cleaned_data['temp_max'],
            temp_min=form.cleaned_data['temp_min'],
            surf_max=form.cleaned_data['surf_max'],
            surf_min=form.cleaned_data['surf_min'],
        )
        alarm_object.save()

它应该是
self.request.user.username

username = User.objects.get(username=self.request.user.username)
或者由于
request.user
已包含当前用户对象,因此可以更好地使用:

username = self.request.user

self.request.username
,首先,请求对象没有名为
username
的属性,因此出现错误。您还在Alram模型中使用ForeignKey作为用户名字段。@ycrad您是否设置了
AUTH\u USER\u Model
?我在编辑消息中解释说:
username
是一个字符域,
self.request.user
是一个懒散的用户对象。将一个函数分配给另一个函数依赖于通过
模型进行的隐式转换。uuu unicode_uuu()
不应该被认为是稳定的,这绝对不是你应该教新django程序员的东西。我个人在使用ORM的LazyLoad用户对象时遇到过很多麻烦。坚持将字符串指定给字符域,以后就不会出现任何奇怪的、难以调试的问题了。@Thomas,谢谢。但用户名是报警模型中的外键,而不是CharField。所以在这种情况下,分配不应该给任何问题。还是我错过了什么?你是对的,我就是那个错过了什么的人。在这种情况下,您的第一个建议是错误的,第二个建议是正确的。@ycrad是的,默认情况下Django使用内置用户模型。