Автозаполнение поля внешнего ключа на основе slug в URL-адресе
Я работаю над сайтом форума, где пользователь выбирает игру, о которой он хочет написать сообщение, и пишет сообщение. Проблема в том, что я не хочу, чтобы пользователь выбирал игру из выпадающего поля внешнего ключа. Я хочу, чтобы поле внешнего ключа заполнялось самостоятельно на основе slug, указанного в URL.
models.py posts app
class Post(models.Model):
title = models.CharField(max_length=200, blank=True, null=True)
user = models.ForeignKey(User, related_name="posts",on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
# need this field automatically filled out
game = models.ForeignKey(Game, related_name="posts",null=True, blank=True,on_delete=models.CASCADE)
slug = models.SlugField(allow_unicode=True, unique=False, null=True, blank=True)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"posts:single",
kwargs={
"username": self.user.username,
"pk": self.pk,
"slug": self.game.slug,
}
)
models.py games app
class Game(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(allow_unicode=True, unique=True)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("games:single", kwargs={"slug": self.slug})
urls.py posts app
urlpatterns = [
path('', views.PostList.as_view(), name="all"),
# need this slug to match the game
path("new/<slug>/", views.CreatePost.as_view(), name="create"),
]
views.py posts app
class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
fields = ('title','message','game')
model = models.Post
select_related = ('user', 'game')
Я предполагаю, что мне нужно захватить игровой объект с тем же slug, что и тот, который указан в url?
Я сделал следующее из параметра slug:game_slug получается slug, по которому я получаю запись из Game (id). По этому id получается запись из Post. Некоторые данные отображаются на странице. Обратите внимание, что при использовании get, требуемая запись должна быть одна.
views.py
def game(request, game_slug):
pos = Game.objects.get(slug=game_slug).id
aaa = Post.objects.get(game_id=pos)
return HttpResponse(f"""
<p>title: {aaa.title}</p>
<p>user: {aaa.user}</p>
<p>created_at: {aaa.created_at}</p>
""")
urls.py
urlpatterns = [
path('new/<slug:game_slug>/', game, name='game'),
]
Почтовые данные выглядят следующим образом:
В моем случае я перешел к:
http://localhost:8000/new/sport/
И получил следующие данные:
post3
user: Tom
created_at: 2022-10-04 14:48:49.576413+00:00