ValueError: Cannot assign "": "Message.name" must be a "CustomUser" instance
ValueError: Cannot assign "": "Message.name" must be a "CustomUser" instance
我正在为我的网站建立实时聊天,并在尝试将消息保存到数据库时遇到此错误消息。我使用 this 教程来创建实时聊天,现在正尝试在我的网站上实现它。不同之处在于我不需要不同的房间,我只希望授权用户访问聊天。问题来了,因为我在 Messages 模型上使用外键来创建带有 CustomUser 模型的 link 。我正在使用频道。
数据来源模板:
const chatSocket = new WebSocket(
'ws://'
+ window.location.host
)
chatSocket.onmessage = function(e) {
console.log(e);
const data = JSON.parse(e.data)
if(data.message) {
document.querySelector('#chat-messages').innerHTML += ('<b>' + data.username + ': </b>' + data.message + '<br>')
} else {
alert('Empty!')
}
}
chatSocket.onclose = function(e) {
console.log('The socket closed unexpectedly');
}
document.querySelector('#chat-message-submit').onclick = function(e) {
const messageInputDom = document.querySelector('#chat-message-input')
const message = messageInputDom.value
chatSocket.send(JSON.stringify({
'message': message,
'name': {{request.user}},
}))
messageInputDom.value = ''
}
用于在 consumers.py
中保存到数据库中的代码
def save_message(self, name, message):
Message.objects.create(name=name, content=message)
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from .managers import CustomUserManager
# Create your models here.
class CustomUser(AbstractUser):
username = models.CharField(max_length=32, blank=True, null=True)
name = models.CharField(max_length=200, unique=True)
steam_id = models.CharField(max_length=17, unique=True, blank=True, null=True, db_column='steam_id')
player = models.TextField(null=True)
user_coins = models.FloatField(default=0.00)
is_active = models.BooleanField(default=True, db_column='status')
is_staff = models.BooleanField(default=False, db_column='isstaff')
is_superuser = models.BooleanField(default=False, db_column='issuperuser')
USERNAME_FIELD = "name"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
class Message(models.Model):
name = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
content = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('date_added',)
通过查看您的 Message
模型,name
是 ForeignKey
到 CustomUser
模型。所以问题出在你的 save_message
中,因为你提供 name
作为 string
但它必须是 CustomUser
实例。
因此,将 consumers.py
中的 save_message
从此
更改
def save_message(self, name, message):
Message.objects.create(name=name, content=message)
到
def save_message(self, name, message):
Message.objects.create(name=user_obj, content=message) <--- add custom user object accordingly
您不能只传递一个字符串并将其引用到 CustomUser
class 的对象。你必须传递它的一个实例。
首先使用 id
或合适的唯一属性获取相关实例,(希望 name
是唯一的)
def get_object(self, name):
return CustomUser.objects.get(name=name)
然后在你的save_message(self, name, message)
方法中传递它,
def save_message(self, name, message):
user_obj = self.get_object(name)
Message.objects.create(name=user_obj, content=message)
我正在为我的网站建立实时聊天,并在尝试将消息保存到数据库时遇到此错误消息。我使用 this 教程来创建实时聊天,现在正尝试在我的网站上实现它。不同之处在于我不需要不同的房间,我只希望授权用户访问聊天。问题来了,因为我在 Messages 模型上使用外键来创建带有 CustomUser 模型的 link 。我正在使用频道。
数据来源模板:
const chatSocket = new WebSocket(
'ws://'
+ window.location.host
)
chatSocket.onmessage = function(e) {
console.log(e);
const data = JSON.parse(e.data)
if(data.message) {
document.querySelector('#chat-messages').innerHTML += ('<b>' + data.username + ': </b>' + data.message + '<br>')
} else {
alert('Empty!')
}
}
chatSocket.onclose = function(e) {
console.log('The socket closed unexpectedly');
}
document.querySelector('#chat-message-submit').onclick = function(e) {
const messageInputDom = document.querySelector('#chat-message-input')
const message = messageInputDom.value
chatSocket.send(JSON.stringify({
'message': message,
'name': {{request.user}},
}))
messageInputDom.value = ''
}
用于在 consumers.py
中保存到数据库中的代码def save_message(self, name, message):
Message.objects.create(name=name, content=message)
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from .managers import CustomUserManager
# Create your models here.
class CustomUser(AbstractUser):
username = models.CharField(max_length=32, blank=True, null=True)
name = models.CharField(max_length=200, unique=True)
steam_id = models.CharField(max_length=17, unique=True, blank=True, null=True, db_column='steam_id')
player = models.TextField(null=True)
user_coins = models.FloatField(default=0.00)
is_active = models.BooleanField(default=True, db_column='status')
is_staff = models.BooleanField(default=False, db_column='isstaff')
is_superuser = models.BooleanField(default=False, db_column='issuperuser')
USERNAME_FIELD = "name"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
class Message(models.Model):
name = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
content = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('date_added',)
通过查看您的 Message
模型,name
是 ForeignKey
到 CustomUser
模型。所以问题出在你的 save_message
中,因为你提供 name
作为 string
但它必须是 CustomUser
实例。
因此,将 consumers.py
中的 save_message
从此
def save_message(self, name, message):
Message.objects.create(name=name, content=message)
到
def save_message(self, name, message):
Message.objects.create(name=user_obj, content=message) <--- add custom user object accordingly
您不能只传递一个字符串并将其引用到 CustomUser
class 的对象。你必须传递它的一个实例。
首先使用 id
或合适的唯一属性获取相关实例,(希望 name
是唯一的)
def get_object(self, name):
return CustomUser.objects.get(name=name)
然后在你的save_message(self, name, message)
方法中传递它,
def save_message(self, name, message):
user_obj = self.get_object(name)
Message.objects.create(name=user_obj, content=message)