Как передать два разных аргумента в одну функцию в Django? - PullRequest
2 голосов
/ 20 апреля 2019

Python, новичок здесь, я пытаюсь создать веб-приложение, в котором грузоотправители могут размещать свои грузовики в продаже и принимать предложения от перевозчиков, а перевозчики могут размещать свои предложения для грузов.

У меня есть функция просмотра списка в моем views.py, где грузоотправитель может видеть все предложения, отправленные разными поставщиками, а затем он может «назначить» одного поставщика для этой последующей загрузки.

loads

Для этого я создал эту функцию, которая принимает 2 аргумента: quiz.id (который является уникальным первичным ключом после загрузки) и идентификатор поставщика.

urls.py

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

views.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 по адресу / учителя / викторина / 13 / результаты /

Обратное значение для 'ConfirmRFQ' с аргументами '(13, 33)' не найдено. Попробован 1 шаблон (ов): ['учителя / подтвердить / (? P [0-9] +) / $']

ошибка.

Не уверен, нужна ли здесь модель, но вот она:

models.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

1 Ответ

3 голосов
/ 20 апреля 2019

Вы можете расширить свой путь с помощью общего количества параметров, например, здесь шаблон должен выглядеть примерно так:

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

Таким образом, представление требует двух параметров здесь: pk и bi.

Например, в вашем шаблоне вы можете получить URL, передав два параметра, например:

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

Обратите внимание, что обновление сущностей обычно не выполняется через запрос GET (поскольку запрос GET не должен иметь побочных эффектов), а через запрос POST.

...