Используйте другую форму, основанную на переменной - PullRequest
0 голосов
/ 06 мая 2019

У меня есть поле «product», которое я хочу использовать, чтобы определить, какую форму отображать.Я пытаюсь сделать это в представлении, но мне интересно, если я должен сделать это в шаблоне вместо этого.Я пробовал следующее, но «форма» не присваивается моими утверждениями if.Что я делаю не так?

@login_required
def update_message(request, pk):
    message = get_object_or_404(Submission, pk=pk)
    author = message.author
    date_posted = message.date_posted
    product = message.product
    message_obj = Submission.objects.get(pk=pk)
    program_type = message.program_type

if author == request.user:

    if request.method == 'POST':
        if product == 'Apple':
            form = AppleForm(request.user, request.POST, instance=message)

        if product == 'Orange':
            form = OrangeForm(request.user, request.POST, instance=message)


        if form.is_valid():
            message_sub = form.save(commit=False)
            message_sub.author = request.user
            message_sub.date_posted = timezone.now()
            message_sub.save()
            form.save_m2m()
            messages.success(request, 'Message updated')
            return redirect('submission-list')
    else:
        if product == 'Apple':
            form = AppleForm(request.user, instance=message)

        if product == 'Orange':
            form = OrangeForm(request.user, instance=message)

else:
    messages.warning(request, 'You can't do that.')
    return redirect('message-submission-list')

return render(request, 'programs/submission_create_form.html', {'product':product,'form': form, 'message_obj': message_obj,'program_type':program_type})

Класс MessageSubmission (models.Model):

message = models.CharField(max_length=5000)
author = models.ForeignKey(User, on_delete=models.CASCADE)
date_posted = models.DateTimeField(default=timezone.now)
program_code = models.ManyToManyField(Program)
program_type = models.CharField(max_length=30, blank=True)
product = models.ForeignKey('Product', on_delete=models.SET_NULL, null=True)
production_cycle = models.ManyToManyField('ProductionCycle', null=True)

def get_absolute_url(self):

    return reverse('submission-list')

def __str__(self):

    return self.message

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Как я уже упоминал в комментарии, проблема в том, что product является ForeignKey для другой модели.В шаблоне FK будет отображаться с использованием метода __str__ этой модели, но это не делает его равным этому отображаемому значению.Вы должны явно сравнить с соответствующим полем на целевой модели:

if product.fruit_type == 'Orange'   # or whatever the field is

(В качестве альтернативы вы могли бы сделать if str(product) == 'Orange', но это более хрупко и связывает логику отображения способом, который не очень хорош.)

1 голос
/ 06 мая 2019

Нет ничего плохого в том, чтобы делать это в представлениях.Если форма не определена после этих if операторов, то это означает, что значение product не Apple или Orange, а что-то еще.Я бы дважды проверил значение product, чтобы исправить проблему.


Поскольку Product - это класс, вы должны ссылаться на поле.Вы не опубликовали код для него, но, например,

if form == product.name

Если есть поле name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...