Skip to main content
 首页 » 编程设计

python之如何在 Django 的单个函数中传递两个不同的参数

2024年08月13日42lidabo

这里是 Python 新手,我正在尝试创建一个网络应用程序,托运人可以在其中发布他们的卡车 cargo 进行销售并接受运输商的出价,而运输商可以发布他们对 cargo 的出价。

我的 views.py 中有一个 ListView 功能,托运人可以在其中查看不同供应商发布的所有出价,然后他可以为该后装货“分配”一个供应商。

为此,我创建了这个函数,它接受 2 个参数:quiz.id(这是后加载的唯一主键)和供应商的 ID。

网址.py

 path('confirm/<int:pk>/', teachers.ConfirmRFQ, name='ConfirmRFQ'), 

View .py

@login_required 
def ConfirmRFQ (request, pk,bi): 
    quiz = Quiz.objects.get(pk=pk) 
    bid = Bid.objects.get(pk=bi) 
    quiz.status = 'Assigned' 
    bid.confirmed = 'Assigned' 
    quiz.save() 
    bid.save() 
 
    return redirect('teachers:quiz_change_list') 

模板中的函数调用:

 <a href="{% url 'teachers:ConfirmRFQ' quiz.pk %}" class="btn btn-primary">Assign</a> 

这里有什么问题吗?我不能传递两个参数吗?因为我不断得到

NoReverseMatch at /teachers/quiz/13/results/

Reverse for 'ConfirmRFQ' with arguments '(13, 33)' not found. 1 pattern(s) tried: ['teachers/confirm/(?P[0-9]+)/$']

错误。

不确定这里是否需要模型,但这里是:

模型.py

class Quiz(models.Model): 
    bid_status_choices = (('Active', 'Active'), ('Assigned', 'Assigned'), ('Dispatched', 'Dispatched'), ('Delayed', 'Delayed'), 
            ('Delivered', 'Delivered')) 
    mtypes =(('Fragile','Fragile'),('Non-Fragile','Non-Fragile')) 
 
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quizzes') 
    name = models.CharField(max_length=255) 
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='quizzes') 
    origin = models.CharField(max_length=255, default=0) 
    destination = models.CharField(max_length=255,default=0) 
    total_trucks = models.IntegerField(default=0) 
    material_type = models.CharField(max_length=255,default=0, choices=mtypes) 
    scheduled_date = models.CharField(max_length=255,default=0) 
    offered_price = models.IntegerField(default=0) 
    status = models.CharField(max_length=255, default='Active', choices=bid_status_choices) 
 
    def __str__ (self): 
        return self.name 
 
class Bid(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers') 
    text = models.CharField('Answer', max_length=255) 
    bid_amount = models.CharField('bid_amount', max_length=255,default=0) 
    is_correct = models.BooleanField('Correct answer', default=False) 
    bid_date = models.DateTimeField(auto_now_add=True) 
 
    def __str__ (self): 
        return self.text 

请您参考如下方法:

你可以用任意数量的参数扩展你的路径,例如这里的模式应该是这样的:

path('confirm/<int:pk>/<b><int:bi></b>', teachers.ConfirmRFQ, name='ConfirmRFQ'),

所以 View 在这里需要两个参数:pk 和bi。

例如,在您的模板中,您可以通过传递两个参数来检索 URL,例如:

{% url 'teachers:ConfirmRFQ' pk=quiz.pk <b>bi=mybid.pk</b> %}

但请注意,更新实体通常不通过 GET 请求完成(因为 GET 请求不应该有任何副作用),而是通过 POST 请求完成。