python - 尝试根据登录用户的用户名创建模型对象时出现“WSGIRequest”错误
问题描述
目标
我正在尝试将 设置为Alarm.username
当前登录的用户名User
。这个问题与另一个查询相同,尽管我的代码有点不同,因为我提取了每个Alarm
对象的位置详细信息。
我如何以及在哪里集成该行: username=User.objects.get(username=self.request.username)
在我的代码中?
错误
Request Method: POST
Request URL: http://jqlc3gdp.apps.lair.io/login/set_alarm/
Django Version: 2.0
Exception Type: AttributeError
Exception Value:
'WSGIRequest' object has no attribute 'username'
Exception Location: /mnt/project/weather_alarm/views.py in get_user_timezone, line 94
代码
模型.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)
表格.py
class SetAlarmForm(ModelForm):
...
class Meta:
model = Alarm
exclude = ['username', 'timezone', 'city', 'country']
视图.py
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
推荐阅读
- java - org.hibernate.LazyInitializationException:未能在另一个环境中延迟初始化角色集合
- html - 从 mongoDB 读取环境变量时,“无法读取未定义的属性 '0'”
- machine-learning - Why does xLearn fit function causes kernel crashes in Jupyter?
- python - pygsheets 上次访问或上次修改时间戳
- python - 使用 SQLITE3 制作的基本数据库
- python - 使用文件匹配括号
- ios - HERE iOS SDK:Places API make*Request 总是返回 nil
- vb.net - VB.NET:如何打印复选框文本和复选框状态
- c# - 如何仅使用 c#(不使用 AWS 开发工具包)从 amazon s3 下载文件
- javascript - IOS 键盘显示时禁用正文滚动