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 图像?

首先,当您调用reversereverse_lazy时,您在argskwargs中提供参数和关键字参数。你不能做 pk_url_kwarg='pk',你需要做 kwargs={'pk_url_kwarg': 'pk'}.

但是你不想使用 kwargs 字典中的字符串 'pk_url_kwarg''pk',你想使用变量 self.pk_url_kwargself.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'])