这是我正在创建的一个简单的博客应用程序。我有一个模型可以创建一篇文章并为每篇文章生成一个 UUID。这按预期工作。
我现在正在尝试从我的模型“Post”中创建一个包含“post_id”对象的视图变量,以便以后可以将此变量插入到我的 html 模板中。令人困惑的是,我知道 Post 模型生成了一个有效的 UUID(至少我对 UUID 的理解),因为我已经看到它生成了,所以我不清楚从哪里开始寻找解决这个问题。网上的其他类似问题似乎与我的问题无关。
我的应用程序/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def blog_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
post_uid = Post.objects.get(pk="post_id")
context = {
"post_uid": post_uid,
"posts": posts
}
return render(request, 'blog/blog_list.html', context)
def article(request, post_id):
current_article = Post.objects.get(pk=post_id)
return render(request, 'blog/article.html', {'current_article':current_article})
我的应用程序/模型.py
from django.db import models
from django.conf import settings
from django.utils import timezone
import uuid
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
post_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
返回的错误
Internal Server Error: /blog/
Traceback (most recent call last):
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 2434, in to_python
return uuid.UUID(**{input_form: value})
File "/usr/lib/python3.8/uuid.py", line 171, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/taylor/tc_site/blog/views.py", line 7, in blog_list
post_uid = Post.objects.get(pk="post_id")
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/query.py", line 424, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/query.py", line 941, in filter
return self._filter_or_exclude(False, args, kwargs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1393, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1412, in _add_q
child_clause, needed_inner = self.build_filter(
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1347, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1193, in build_lookup
lookup = lookup_class(lhs, rhs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/lookups.py", line 25, in __init__
self.rhs = self.get_prep_lookup()
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/lookups.py", line 77, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 2418, in get_prep_value
return self.to_python(value)
File "/home/taylor/tc_site/virtualenv/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 2436, in to_python
raise exceptions.ValidationError(
django.core.exceptions.ValidationError: ['“post_id” is not a valid UUID.']
此外,如果它很有价值 - 添加 post_id 对象时的最新迁移文件。
myapp/migrations/0002_auto_20210830_1450.py
from django.db import migrations, models
import uuid
def create_uuid(apps, schema_editor):
Post = apps.get_model('blog', 'Post')
for x in Post.objects.all():
x.post_id = uuid.uuid4()
x.save()
class Migration(migrations.Migration):
dependencies = [
('blog', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='post',
name='id',
),
migrations.AddField(
model_name='post',
name='post_id',
field=models.UUIDField(blank=True, null=True),
),
migrations.RunPython(create_uuid),
migrations.AlterField(
model_name='post',
name='post_id',
field=models.UUIDField(default=uuid.uuid4, unique=True)
)
]