如果记录以1:1存在,则将Createview重定向到Updateview



如果登录用户已经在organizations模型中创建了记录,我将尝试将其重定向到Updateview而不是Createview。我的organizationsusers模型具有1:1的关系。

如果相关记录存在,我目前可以使用get方法返回Updateview,但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"),
]

型号.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

视图.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()

表单.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']

您应该重定向,而不是直接调用视图。

if self.model.objects.get(user=self.request.user):
return redirect("organisations:update")
else:
return super().get(*args, **kwargs)

所以你的问题是你在return更新视图,而你应该在redirect更新视图。返回一个指向更新URL的HttpResponseRedirect会给你想要的。只需确保将相关组织的pk传递到重定向url即可。

最新更新