簡體   English   中英

基於 URL 中的 slug 自動填充外鍵字段

[英]Autofill foreign key field based on the slug in the URL

我在一個論壇網站上工作,用戶可以在其中選擇他們想要發布的游戲並撰寫帖子。 問題是我不希望用戶從下拉外鍵字段中訪問 select 游戲。 我希望外鍵字段根據 URL 中提供的 slug 自行填充。

models.py 帖子應用程序

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 游戲應用程序

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 帖子應用程序

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 帖子應用程序

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    fields = ('title','message','game')
    model = models.Post
    select_related = ('user', 'game')
        

我猜我需要使用與 url 中提供的相同的 slug 來獲取游戲 object?

我從 slug:game_slug 參數中執行了以下操作,結果是我從 Game (id) 中獲取記錄的 slug。 通過這個id,得到一條來自Post的記錄。 一些數據顯示在頁面上。 注意這里用的是get,必填項必須是一個。

視圖.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>
        """)

網址.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM