reverse() 得到了一个意外的关键字参数 'pk_url_kwarg' - UpdateView
reverse() got an unexpected keyword argument 'pk_url_kwarg' - UpdateView
我正在尝试使用 Django 内置 class UpdateView
来更新图像模型
型号是:
def get_image_path(instance, filename):
return '/'.join(['studyoffer_images', instance.study_offer.slug, filename])
class UploadStudyOffer(models.Model):
study_offer = models.ForeignKey(StudiesOffert, related_name='uploadsstudyoffer')
image = models.ImageField(upload_to=get_image_path, verbose_name='Seleccionar imagen')
# images folder per object
featured = models.BooleanField(default=False, verbose_name='Destacada',
help_text='Indica si la imagen aparecera en el carrusel')
thumbnail = models.BooleanField(default=False)
active = models.BooleanField(default=True, verbose_name='Activa',
help_text='Indica si una imagen de oferta esta habilitada o disponible')
objects = UploadStudyOfferManager()
def __str__(self):
return self.study_offer.ad_title
这个模型的形式是:
class StudyOfferImagesUploadForm(forms.ModelForm):
class Meta:
model = UploadStudyOffer
fields = ('image', 'active', 'featured')
我现在想要的是让用户可以编辑图片并且可以更改它并更改状态图片(featured
, active
, thumbnail
)
然后我构建我的 StudyOfferImageUpdateView
来更新图像属性:
class StudyOfferImageUpdateView(SuccessMessageMixin, UserProfileDataMixin, LoginRequiredMixin, UpdateView):
model = UploadStudyOffer
form_class = StudyOfferImagesUploadForm
success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
success_message = "Imagen actualizada"
def get_context_data(self, **kwargs):
context = super(StudyOfferImageUpdateView, self).get_context_data(**kwargs)
user = self.request.user
return context
def get_object(self):
return get_object_or_404(UploadStudyOffer, pk=self.kwargs.get('pk'))
访问此视图的 URL 是:
url(r"^study-offer/edit/images/(?P<pk>\d+)/$",
StudyOfferImageUpdateView.as_view(),
name='edit-study-offer-image'
),
当我想编辑图片时,模板是这样的:
{% block body_content %}
<h2>Editar imágen</h2>
<form role="form" action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update" class="submit-button">
</form>
{% endblock %}
此模板已正确呈现,但是当我按下 Update
提交按钮时,出现此错误:
Exception Type: TypeError at /host/study-offer/edit/images/47/
Exception Value: reverse() got an unexpected keyword argument 'pk_url_kwarg'
这个错误存在,因为在我的StudyOfferImageUpdateView
Django 不接受success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
我尝试在 StudyOfferImageUpdateView
中打印 pk_url_kwarg='pk'
句子
q=pk_url_kwarg='pk'
print(q)
当我通过浏览器输入 StudyOfferImageUpdateView
时的输出是:
# pk string, is not the pk value
pk
System check identified no issues (0 silenced).
October 24, 2017 - 15:58:55
Django version 1.10.7, using settings 'hostayni.settings.development'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[24/Oct/2017 15:58:57] "GET /host/study-offer/edit/images/47/ HTTP/1.1" 200 8559
我知道在 get_context_data()
方法中 pk_url_kwarg='pk'
句子是有效的,我在 success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
中传递它并得到一个字符串 pk
出于这个原因我的工作流程坏了。
我如何才能在我的 success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
中传递正确的参数,它需要一个 pk
图像?
首先,当您调用reverse
或reverse_lazy
时,您在args
和kwargs
中提供参数和关键字参数。你不能做 pk_url_kwarg='pk'
,你需要做 kwargs={'pk_url_kwarg': 'pk'}
.
但是你不想使用 kwargs
字典中的字符串 'pk_url_kwarg'
和 'pk'
,你想使用变量 self.pk_url_kwarg
和 self.kwargs['pk']
从视图。
如果设置 success_url
,则无法访问这些变量,因此您需要改写 get_success_url
。
def get_success_url(self):
return reverse("host:edit-study-offer-image", kwargs={self.pk_url_kwarg:self.kwargs['pk']})
由于您的视图不打算进行子类化和自定义,我认为您根本不需要使用 pk_url_kwarg
。我会通过硬编码 'pk'
.
来简化代码
def get_success_url(self):
return reverse("host:edit-study-offer-image", kwargs={'pk': self.kwargs['pk']})
或使用args
代替:
def get_success_url(self):
return reverse("host:edit-study-offer-image", args=[self.kwargs['pk'])
我正在尝试使用 Django 内置 class UpdateView
来更新图像模型
型号是:
def get_image_path(instance, filename):
return '/'.join(['studyoffer_images', instance.study_offer.slug, filename])
class UploadStudyOffer(models.Model):
study_offer = models.ForeignKey(StudiesOffert, related_name='uploadsstudyoffer')
image = models.ImageField(upload_to=get_image_path, verbose_name='Seleccionar imagen')
# images folder per object
featured = models.BooleanField(default=False, verbose_name='Destacada',
help_text='Indica si la imagen aparecera en el carrusel')
thumbnail = models.BooleanField(default=False)
active = models.BooleanField(default=True, verbose_name='Activa',
help_text='Indica si una imagen de oferta esta habilitada o disponible')
objects = UploadStudyOfferManager()
def __str__(self):
return self.study_offer.ad_title
这个模型的形式是:
class StudyOfferImagesUploadForm(forms.ModelForm):
class Meta:
model = UploadStudyOffer
fields = ('image', 'active', 'featured')
我现在想要的是让用户可以编辑图片并且可以更改它并更改状态图片(featured
, active
, thumbnail
)
然后我构建我的 StudyOfferImageUpdateView
来更新图像属性:
class StudyOfferImageUpdateView(SuccessMessageMixin, UserProfileDataMixin, LoginRequiredMixin, UpdateView):
model = UploadStudyOffer
form_class = StudyOfferImagesUploadForm
success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
success_message = "Imagen actualizada"
def get_context_data(self, **kwargs):
context = super(StudyOfferImageUpdateView, self).get_context_data(**kwargs)
user = self.request.user
return context
def get_object(self):
return get_object_or_404(UploadStudyOffer, pk=self.kwargs.get('pk'))
访问此视图的 URL 是:
url(r"^study-offer/edit/images/(?P<pk>\d+)/$",
StudyOfferImageUpdateView.as_view(),
name='edit-study-offer-image'
),
当我想编辑图片时,模板是这样的:
{% block body_content %}
<h2>Editar imágen</h2>
<form role="form" action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update" class="submit-button">
</form>
{% endblock %}
此模板已正确呈现,但是当我按下 Update
提交按钮时,出现此错误:
Exception Type: TypeError at /host/study-offer/edit/images/47/
Exception Value: reverse() got an unexpected keyword argument 'pk_url_kwarg'
这个错误存在,因为在我的StudyOfferImageUpdateView
Django 不接受success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
我尝试在 StudyOfferImageUpdateView
pk_url_kwarg='pk'
句子
q=pk_url_kwarg='pk'
print(q)
当我通过浏览器输入 StudyOfferImageUpdateView
时的输出是:
# pk string, is not the pk value
pk
System check identified no issues (0 silenced).
October 24, 2017 - 15:58:55
Django version 1.10.7, using settings 'hostayni.settings.development'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[24/Oct/2017 15:58:57] "GET /host/study-offer/edit/images/47/ HTTP/1.1" 200 8559
我知道在 get_context_data()
方法中 pk_url_kwarg='pk'
句子是有效的,我在 success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
中传递它并得到一个字符串 pk
出于这个原因我的工作流程坏了。
我如何才能在我的 success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')
中传递正确的参数,它需要一个 pk
图像?
首先,当您调用reverse
或reverse_lazy
时,您在args
和kwargs
中提供参数和关键字参数。你不能做 pk_url_kwarg='pk'
,你需要做 kwargs={'pk_url_kwarg': 'pk'}
.
但是你不想使用 kwargs
字典中的字符串 'pk_url_kwarg'
和 'pk'
,你想使用变量 self.pk_url_kwarg
和 self.kwargs['pk']
从视图。
如果设置 success_url
,则无法访问这些变量,因此您需要改写 get_success_url
。
def get_success_url(self):
return reverse("host:edit-study-offer-image", kwargs={self.pk_url_kwarg:self.kwargs['pk']})
由于您的视图不打算进行子类化和自定义,我认为您根本不需要使用 pk_url_kwarg
。我会通过硬编码 'pk'
.
def get_success_url(self):
return reverse("host:edit-study-offer-image", kwargs={'pk': self.kwargs['pk']})
或使用args
代替:
def get_success_url(self):
return reverse("host:edit-study-offer-image", args=[self.kwargs['pk'])