试图将模型的外键传递到URL中进行动态路由



我有3个模型,一个自定义用户模型(使用AbstractUser - user/Brand模型)和一个消息模型:

class User(AbstractUser):
is_brand = models.BooleanField(default=False)
is_influencer = models.BooleanField(default=False)
class Brand(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name="brand_info")
email = models.EmailField()
brand_name = models.CharField(max_length=100, blank=True)
class Message(models.Model):
recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='recipient')
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
message_content = models.TextField()
send_time = models.DateTimeField(auto_now_add=True)

我有一个视图,我想加载与特定品牌相关的所有消息,并且这个页面也将具有属性(来自品牌模型)作为动态URL参数。

下面是views.py的当前代码:

def conversation_view(request, username):
messages = Message.objects.filter(Q(message__sender=username) | Q(message__recipient=username)).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})

这里是url。py:

urlpatterns = [
path('conversation/<username>/', views.conversation_view, name='conversation_view')
]

当我尝试加载具有适当对话/URL的页面时,我得到以下错误消息:invalid literal for int() with base 10: 'username'

我不知道为什么Django在这里期待一个int() ?是因为我在视图中使用消息模型的发送者/接收者,这两个都是外键吗?

您在message__sender上进行过滤,因此它期望User对象或User对象的主键。

您可以使用message__sender__username=username进行过滤,同样适用于recepient:

def conversation_view(request, username):
messages = Message.objects.filter(
Q(message__sender__username=username) |
Q(message__recipient__username=username)
).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})

注意:通常最好使用settings.AUTH_USER_MODEL[Django-doc]引用用户模型,而不是使用User直接建模[Django-doc]。要了解更多信息,您可以查看引用User模型文档部分。

相关内容

  • 没有找到相关文章

最新更新