verse() 得到了意外的关键字参数 'pk_url_kwarg' - UpdateView

bga*_*ial 1 python django django-class-based-views

我正在尝试使用 Django 内置类UpdateView来更新图像模型

\n\n

模型是:

\n\n
def get_image_path(instance, filename):\n return \'/\'.join([\'studyoffer_images\', instance.study_offer.slug, filename])\n\n\nclass UploadStudyOffer(models.Model):\n\n    study_offer = models.ForeignKey(StudiesOffert, related_name=\'uploadsstudyoffer\')\n\n    image = models.ImageField(upload_to=get_image_path, verbose_name=\'Seleccionar imagen\')\n    # images folder per object\n\n    featured = models.BooleanField(default=False, verbose_name=\'Destacada\',\n                                   help_text=\'Indica si la imagen aparecera en el carrusel\')\n    thumbnail = models.BooleanField(default=False)\n\n    active = models.BooleanField(default=True, verbose_name=\'Activa\',\n                                 help_text=\'Indica si una imagen de oferta esta habilitada o disponible\')\n\n    objects = UploadStudyOfferManager()\n\n    def __str__(self):\n        return self.study_offer.ad_title\n
Run Code Online (Sandbox Code Playgroud)\n\n

该模型的形式为:

\n\n
class StudyOfferImagesUploadForm(forms.ModelForm):\n    class Meta:\n        model = UploadStudyOffer\n        fields = (\'image\', \'active\', \'featured\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我现在想要的是允许用户编辑图像并可以更改它并更改状态图像(featured,,,)activethumbnail

\n\n

然后我构建我的StudyOfferImageUpdateView来更新图像属性:

\n\n
class StudyOfferImageUpdateView(SuccessMessageMixin, UserProfileDataMixin, LoginRequiredMixin, UpdateView):\n    model = UploadStudyOffer\n    form_class = StudyOfferImagesUploadForm\n    success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')\n    success_message = "Imagen actualizada"\n\n    def get_context_data(self, **kwargs):\n        context = super(StudyOfferImageUpdateView, self).get_context_data(**kwargs)\n\n        user = self.request.user\n        return context\n\n    def get_object(self):\n        return get_object_or_404(UploadStudyOffer, pk=self.kwargs.get(\'pk\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

访问该视图的 URL 是:

\n\n
url(r"^study-offer/edit/images/(?P<pk>\\d+)/$",\n        StudyOfferImageUpdateView.as_view(),\n        name=\'edit-study-offer-image\'\n    ),\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我想编辑图像时,模板是这样的:

\n\n
{% block body_content %}\n\n<h2>Editar im\xc3\xa1gen</h2>\n<form role="form" action="" method="POST" enctype="multipart/form-data">\n    {% csrf_token %}\n    {{ form.as_p }}\n          <input type="submit" value="Update" class="submit-button"> \n</form>\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该模板已正确呈现,但是当我按下Update提交按钮时,出现以下错误:

\n\n
Exception Type: TypeError at /host/study-offer/edit/images/47/\nException Value: reverse() got an unexpected keyword argument \'pk_url_kwarg\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个错误存在,因为在我的StudyOfferImageUpdateViewDjango中不接受success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')

\n\n

我尝试打印pk_url_kwarg=\'pk\'我里面的句子StudyOfferImageUpdateView

\n\n
q=pk_url_kwarg=\'pk\'\n    print(q)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我通过浏览器输入时的输出StudyOfferImageUpdateView是:

\n\n
# pk string, is not the pk value\npk\nSystem check identified no issues (0 silenced).\nOctober 24, 2017 - 15:58:55\nDjango version 1.10.7, using settings \'hostayni.settings.development\'\nStarting development server at http://127.0.0.1:8000/\nQuit the server with CONTROL-C.\n[24/Oct/2017 15:58:57] "GET /host/study-offer/edit/images/47/ HTTP/1.1" 200 8559\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道在get_context_data()方法中pk_url_kwarg=\'pk\',它的工作原理,我将其传递success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')并到达一个字符串pk,因此我的工作流程被破坏了。

\n\n

如何在我success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')期望的pk图像中传递正确的参数?

\n

Ala*_*air 5

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

但是,您不想使用字典中的字符串'pk_url_kwarg'和,您想使用视图中的变量和。'pk'kwargsself.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']})
Run Code Online (Sandbox Code Playgroud)

由于您的视图无意进行子类化和自定义,因此我认为您pk_url_kwarg根本不需要使用。我会通过硬编码来简化代码'pk'

def get_success_url(self):
    return reverse("host:edit-study-offer-image", kwargs={'pk': self.kwargs['pk']})
Run Code Online (Sandbox Code Playgroud)

或者使用args

def get_success_url(self):
    return reverse("host:edit-study-offer-image", args=[self.kwargs['pk'])
Run Code Online (Sandbox Code Playgroud)