В Django, как перенаправить на UpdateView после отправки CreateView? - PullRequest
0 голосов
/ 17 апреля 2019

Я создал один FormView и шаблон HTML, которые я собираюсь использовать для создания и обновления записей из модели.

Однако я не могу понять, как настроить CreateView для перенаправления на новый первичный ключ, который создается. В настоящее время я настроил его на возврат к базовой странице, но, похоже, я не могу найти никакой информации о том, с чего начать с получения нового или существующего первичного ключа для перенаправления в UpdateView.

models.py

class NewEmployee(models.Model):
    name = models.CharField(max_length=50)
    position = models.CharField(max_length=50)
    start_date = models.DateField()
    date_entered = models.DateTimeField('date entered', auto_now_add=True)

forms.py

class NewEmpForm(ModelForm):
    class Meta:
        model = NewEmployee
        fields = ['name', 'position', 'start_date']

views.py

class EditView(UpdateView):
    model = NewEmployee
    form_class = NewEmpForm


class Add_Emp(CreateView):
    model = NewEmployee
    form_class = NewEmpForm

urls.py

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('add/', views.Add_Emp.as_view(success_url='../'), name='newemp-add'),
    path('<int:pk>/', views.EditView.as_view(success_url="../"), name='newemp-rev'),
]

newemployee_form.html

<DOCTYPE html>
<html>
<head>
<title>Employee</title>
</head>
<body>

<form method="post" >
{% csrf_token %}
{{form.as_p}}

<button type="submit" class="btn btn-default">Submit</button>
</form>
</body>
</html>

Ответы [ 4 ]

0 голосов
/ 17 апреля 2019

Эта статья может помочь:

https://realpython.com/django-redirects/#redirects-in-django

Вы можете написать код перенаправления в методе is_valid ().

0 голосов
/ 17 апреля 2019

В вашем CreateView вы обычно переопределяете метод form_valid, который запускается после проверки формы:

from django.shortcuts import redirect


class Add_Emp(CreateView):
    model = NewEmployee
    form_class = NewEmpForm

    def form_valid(self, form):
        employee = form.save()  # save form
        return redirect('newemp-rev', pk=employee.pk)
0 голосов
/ 17 апреля 2019

Вы можете получить объект, сохраненный в CreateView, переопределив get_success_url

class MyCreateView(CreateView):
    ...
    def get_success_url(self):
        return reverse('newemp-rev', [self.object.pk])
0 голосов
/ 17 апреля 2019

Вы не можете использовать success_url для этого, потому что вам нужен доступ к объекту, чтобы получить его pk.

Самый простой способ сделать это - переопределить get_absolute_url для вашей модели.

class NewEmployee(models.Model):
    ...

    def get_absolute_url(self):
        return reverse('newemp-rev', [self.pk])

Затем удалите success_url из ваших шаблонов URL для создания и обновления представлений.По умолчанию они оба будут использовать метод объекта get_absolute_url для получения URL-адреса для перенаправления.

Если вы не хотите переопределять get_absolute_url, тогда переопределите get_success_url для обоих представлений, например:

class Add_Emp(CreateView):
    model = NewEmployee
    form_class = NewEmpForm

    def get_success_url(self):
        return reverse('newemp-rev', [self.object.pk])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...