перенаправить Createview в Updateview, если запись существует в 1: 1 - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь перенаправить вошедшего в систему пользователя на Updateview вместо Createview, если они уже создали запись в модели organizations.Мой organizations имеет отношение 1: 1 с моей users моделью.

В настоящее время я могу вернуть Updateview с помощью метода get, если связанная запись существует, но URL-адрес не являетсяперенаправлено на /update

Мой код:

urls.py

urlpatterns = [
    path("add/", view=organization_add_view, name="add"),
    path("update/", view=organization_update_view, name="update"),
    path("<int:id>/<str:slug>", view=organization_detail_view, name="detail"),
]

models.py

class Organization(TimeStampedModel):

    name = CharField(_("Organization Name"), blank=False, max_length=255, unique=True)
    slug = AutoSlugField(_('slug'), max_length=100, unique=False, populate_from=('name',))
    user = OneToOneField(settings.AUTH_USER_MODEL, on_delete=CASCADE, db_index=True)

    def __str__(self):
        return self.name

views.py

class OrganizationDetailView(DetailView):

    model = Organization
    slug_field = "slug"
    slug_url_kwarg = "slug"

organization_detail_view = OrganizationDetailView.as_view()


class OrganizationAddView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    model = Organization
    form_class = OrganizationForm

    success_message = "%(name)s was created successfully"

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        obj.save()
        return self.get_success_url()

    def get_form_kwargs(self):
        kwargs = super(OrganizationAddView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

    def get_initial(self):
        return {
            'user': self.request.user,
            'is_update': False
        }


    def get(self, *args, **kwargs):
        if self.model.objects.filter(user=self.request.user).exists():
            return redirect("organizations:update")
        else:
            return super(OrganizationAddView, self).get(*args, **kwargs)

    def get_success_url(self):
        return reverse("organizations:list")

organization_add_view = OrganizationAddView.as_view()


class OrganizationUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    model = Organization
    form_class = OrganizationForm
    success_message = 'Organization updated successfully.'

    def get_object(self, queryset=None):
        obj = self.model.objects.get(user=self.request.user)
        return obj

    def get_initial(self):
        return {
            'is_update': True
        }

    def get(self, *args, **kwargs):
        if self.model.objects.filter(user=self.request.user).exists():
            return super().get(*args, **kwargs)
        else:
            return redirect("organizations:add")

    def get_form_kwargs(self):
        kwargs = super(OrganizationUpdateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

    def get_success_url(self):
        return reverse("organizations:update")

organization_update_view = OrganizationUpdateView.as_view()

forms.py

class OrganizationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop("request")

        super(OrganizationForm, self).__init__(*args, **kwargs)

        organization = kwargs.get('instance')

        user = self.request.user

        self.helper = FormHelper(self)
        if organization:
            if organization.email is None:
                self.initial['email'] = self.request.user.email
        elif user.email:
            self.initial['email'] = user.email

        self.helper.form_method = 'post'

        submit_btn_text = 'Continue'

        if kwargs.get('initial')['is_update']:
            submit_btn_text = 'Update'

        self.helper.add_input(Submit('submit', submit_btn_text)) 

    class Meta:
        model = Organization
        widgets = {
            'description': forms.Textarea(attrs={'rows': 10, 'cols': 60}),
            # 'logo': forms.ImageField()
        }
        fields = '__all__'
        exclude = ['created', 'expires', 'is_sponsor', 'view_count', 'user']

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы должны перенаправить, а не вызывать представление напрямую.

    if self.model.objects.get(user=self.request.user):
        return redirect("organisations:update")
     else:
        return super().get(*args, **kwargs)
0 голосов
/ 07 февраля 2019

Итак, ваша проблема здесь в том, что вы return просматриваете обновление, когда вам нужно redirect перейти к нему.Возвращая HttpResponseRedirect , который указывает на URL-адрес обновления, вы получите именно то, что вам нужно.Просто убедитесь, что передали pk соответствующей организации на URL перенаправления.

...