bga*_*ial 1 python django django-class-based-views
我正在尝试使用 Django 内置类UpdateView来更新图像模型
模型是:
\n\ndef 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\nRun Code Online (Sandbox Code Playgroud)\n\n该模型的形式为:
\n\nclass StudyOfferImagesUploadForm(forms.ModelForm):\n class Meta:\n model = UploadStudyOffer\n fields = (\'image\', \'active\', \'featured\')\nRun Code Online (Sandbox Code Playgroud)\n\n我现在想要的是允许用户编辑图像并可以更改它并更改状态图像(featured,,,)activethumbnail
然后我构建我的StudyOfferImageUpdateView来更新图像属性:
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\'))\nRun Code Online (Sandbox Code Playgroud)\n\n访问该视图的 URL 是:
\n\nurl(r"^study-offer/edit/images/(?P<pk>\\d+)/$",\n StudyOfferImageUpdateView.as_view(),\n name=\'edit-study-offer-image\'\n ),\nRun 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 %}\nRun Code Online (Sandbox Code Playgroud)\n\n该模板已正确呈现,但是当我按下Update提交按钮时,出现以下错误:
Exception Type: TypeError at /host/study-offer/edit/images/47/\nException Value: reverse() got an unexpected keyword argument \'pk_url_kwarg\'\nRun Code Online (Sandbox Code Playgroud)\n\n这个错误存在,因为在我的StudyOfferImageUpdateViewDjango中不接受success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')
我尝试打印pk_url_kwarg=\'pk\'我里面的句子StudyOfferImageUpdateView
q=pk_url_kwarg=\'pk\'\n print(q)\nRun Code Online (Sandbox Code Playgroud)\n\n当我通过浏览器输入时的输出StudyOfferImageUpdateView是:
# 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\nRun 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,因此我的工作流程被破坏了。
如何在我success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg=\'pk\')期望的pk图像中传递正确的参数?
首先,当您调用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)
| 归档时间: |
|
| 查看次数: |
4872 次 |
| 最近记录: |