当前位置: 首页 > 知识库问答 >
问题:

Python:如何在Django模板中传递外键的值?

易流觞
2023-03-14

我创建了一个出价模型,以便类型2用户可以在类型1用户创建的一些“帖子”上出价。为了实现这一点,我在模型“出价”中为帖子字段做了一个外键。

实际上,我想把出价与一个特定的帖子联系起来,在“帖子”模型中自动生成“id”。因此,我将get_absolute_url放在我的模板中的Post'id'旁边。我是django的新手,我不确定它是否能满足我的需求。

我如何将带有post_id的出价与模板中的某个特定帖子相关联,以便获得不同类型2用户对特定帖子的出价金额?如果能帮我解决这个问题,我将不胜感激。

这是我的密码:

Models.py:

class Post(models.Model):

    post_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    from1 = models.CharField(max_length=20)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    objects = PostManager()

    def __str__(self):
        return self.post_id

    def get_absolute_url(self):
        return reverse("posts:detail", kwargs={"id": self.post_id})

    class Meta:
        ordering = ["-timestamp", "-Time"]

class Bid(models.Model):

    bid_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    post = models.ForeignKey(Post, default=uuid.uuid4, related_name='bids' )
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True, unique=False)
    amount = models.IntegerField()

    def get_absolute_url(self):
        return reverse("accept_bid", kwargs={"bid_id": self.bid_id})

    def __unicode__(self):
        return self.amount

    def __str__(self):
        return self.amount

forms.py:

class BidForm(forms.ModelForm):
    // Defined a post field as ModelChoiceField
    post = forms.ModelChoiceField(queryset= Post.objects.all(), label="Post", widget=forms.RadioSelect(), initial=0)
    amount = forms.IntegerField(help_text='Place the bid for a Post')

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['post'].queryset = Post.objects.all

    class Meta:
        model = Bid
        fields = ["amount"]

views.py:

def live_bid_truck(request, **kwargs):
    if request.method=='post':
        form = BidForm(request.POST or None)

        if  form.is_valid():
         bid = form.save(post)
         bid = form.save(commit=False)
         print(form.cleaned_data.get('amount'))
         bid.user = request.user
         bid.post = form.cleaned_data['post'] // Set my post here


         bid.save()
    else:
        form=BidForm()
        post_queryset = Post.objects.all()
        context = {
        "post_queryset": post_queryset, 
        "title": "List",
        'form': form,

    }
        return render(request, 'loggedin_truck/live_bid_truck.html', context)

live_bid_truck.html

{% for post in post_queryset %}
<table class="table table-striped, sortable">
    <thead>
        <tr>

            <th>Load No.</th>
            <th>From</th>
        </tr>
    </thead>
    <tbody>
        <tr> // Returns the post_queryset with radio buttons
            <td >{{form.post}} </td>
            <td>{{ post.from1 }}</a><br/></td>
        </tr> 
    </tbody>
</table>
<table class="table table-striped, sortable "  style="margin-top: 10px">
    <thead>
        <tr>
            <th> Amount</th>
        </tr>
    </thead>
    <tbody>
        <tr>     
            <form class="nomargin" method='POST' action='' enctype='multipart/form-data'>{% csrf_token %}
            <td>{% render_field  form.amount  class="form-control" %}</td>
        </tr>
     </tbody>
 </table>

<input type='submit' value='Post Bid'/></form>

{% endfor %}

更新-1:

Views.py:

def live_bids(request):
    post_queryset = Post.objects.all().prefetch_related('bids')
    bid_queryset = Bid.objects.all().order_by('amount')

    context = {
        "post_queryset": post_queryset,
        "bid_queryset": bid_queryset,
        "title": "List",
    }
    return render(request, 'loggedin_load/live_bids.html', context)

live_bids.html:

{% for post in post_queryset %}
{{post.id}}
{% for bid in post.bids.all %}
{{bid.amount}}
{% endfor %}
{% endfor %}

共有1个答案

微生令
2023-03-14

如果我理解正确,目标是能够在帖子上列出相关的投标人/投标?如果是这样,那么你可以使用prefetch_related的select_related(如果你从孩子中选择父母)(如果你在做反向查找)

1) 首先,在您的出价模式中,更好的相关名称将是“出价”,如下所示;

post = models.ForeignKey(Post, default=1, related_name='bids' )

2)其次在deflive_bid_truck(请求):做这样的文章查询,这样你就可以在一个数据库中找到所有相关的对象。;

Post.objects.all().prefetch_related('bids') 

3) 然后在你的模板中,你可以使用它来访问文章的相关出价

{% for bid in post.bids.all %} // In your case post is obj
    {{ bid }}  // Access whatever you need from the bid like {{ bid.user }}
{% endfor %}

您应该能够调用post.bids.all,并通过只遵循向后关系来接收值,即使没有预取。如果您没有得到任何值,那么您可能没有正确设置它们<代码>预回迁相关的有助于随着帖子数量的增加提高性能。

从你的代码

在您的BidForm中没有对post的引用,我不知道您的自定义save()方法中是否有它。当您按原样保存此表单时,post\u id将是默认值1

# NO REFENCE TO post
class BidForm(forms.ModelForm):

 class Meta:
    model = Bid
    fields = ["amount"]  

同样在视图中也不设置帖子。

def live_bid_truck(request):

    form = BidForm(request.POST or None)

    if  form.is_valid():
        bid = form.save(commit=False)

        print(form.cleaned_data.get("amount"))
        bid.user = request.user # YOU SET THE USER 
        bid.post = ?? # YOU DON'T SET THE POST HERE EITHER, 
                      # SO ALL YOUR BIDS HAVE THE DEFAULT POST id = 1
                      # DO YOU ACTUALLY HAVE POST with id = 1?

        bid.save()

        # WHAT HAPPENS IF YOU PRINT BID POST ID HERE ?? 
        # CHECK HERE IF YOU REALLY HAVE THE RELATED POST ID.
        print(bid.post.id)
 类似资料:
  • 问题内容: 我知道你会说这个问题被问过很多次了,但是我还没有解决呢… models.py views.py 模板: 我已经尝试过上面的模板,但没有得到任何结果。所以我想在DocImage类中获取imageurl地址… 所有帮助 问题答案: 如果您查看外键文档,如果您有类似的关系 您需要像这样在DocImages类上定义外键: 如果您未设置相关名称,则可以像下面这样从Doc访问DocImage: 有

  • 德夫斯, 我有一个2个模型,其中一个有一个外键属性作为对另一个的引用。现在我尝试在模板中查看这两个对象。 在我的模板中,我只想要我的产品的确切市场 我尝试了这样的东西: 在循环中,我得到像x1、x2、x3和object.market这样的字符串的值为x1。 所以我只想输出x1。 这些是我的模型:

  • 问题内容: 我有一个表单,可以在用户输入信息后重定向到同一页面(以便他们可以继续输入信息)。如果表单提交成功,我将返回 效果很好。但是,在这种情况下,我还想向用户显示一些消息(例如,屏幕顶部的“您的数据已保存”)。如果不进行重定向,我只会在上下文字典中返回这些消息。但是,有了重定向,我无法做到这一点。 那么在使用HttpResponseRedirect时如何传递模板上下文信息? 我正在尝试做的事情

  • 对编码来说是新的,如果已经涵盖了,请道歉。花了几个晚上在Django的文档、YouTube、谷歌和这里尝试各种方法来解决这个问题。 我有一个与驾驶员相关的模型路线,我试图在我的模板上显示所有与该路线相关的驾驶员的路线。然而,目前我所能得到的只是来自路线模型的数据,而不是相关驾驶员的数据。 会感谢任何帮助,因为我正在努力让我的头! Models.py Views.py 样板 我尝试过.prefetc

  • 问题内容: 我的结构是这样的: 而结构是: 我主要尝试这样做: 是否可以在模板内部执行类似的操作? 问题答案: 引用的文档,该操作的语法: 这意味着您可以将一个可选数据传递给模板执行,而不是更多。如果要传递多个值,则必须将它们包装为传递的某个单个值。 因此,我们应该将这些数据包装到struct或map中。但是我们不能在模板中编写Go代码。我们可能要做的是注册一个函数,将这些数据传递给该函数,该函数

  • 问题内容: Django在其模板中将其视为某些变量。我怎样才能逃避或或使得Django不把它当作变量。 应该打印完全一样。 问题答案: 我相信您正在寻找template标签。 如链接到文档所述, 由于模板系统没有“转义”的概念,因此要显示模板标签中使用的位之一,必须使用标签。 例如: 将显示为: