【问题标题】:Having trouble passing a slug to UpdateView so that it gets the correct data无法将 slug 传递给 UpdateView 以获取正确的数据
【发布时间】:2016-02-27 11:46:09
【问题描述】:

我正在尝试允许用户使用 UpdateView 编辑输入到其项目中的信息。我一直收到一条错误消息,提示“必须使用对象 pk 或 slug 调用通用详细视图 UpdateProject。”我曾尝试指向 UpdateView 类中的 slug,但无法使其工作。我是 Django 新手,非常感谢任何帮助!

观看次数

class CreateProject(CreateView):
    model = UserProject
    form_class = UserProjectForm
    template_name = 'howdidu/create_project.html'

    def form_valid(self, form):
        userproject = form.save(commit=False)
        form.instance.user = self.request.user
        userproject.save()
        self.object = userproject
        return super(CreateProject, self).form_valid(form)

    def get_success_url(self):
        project_username = self.request.user.username
        project_slug = self.object.slug
        return reverse('user_project', kwargs={'username':project_username, 'slug': project_slug})

class UpdateProject(UpdateView):
    model = UserProject
    form_class = UserProjectForm
    template_name = 'howdidu/update_project.html'
    slug_field = 'slug'

    def form_valid(self, form):
        userproject = form.save(commit=False)
        form.instance.user = self.request.user
        userproject.save()
        self.object = userproject
        return super(UpdateProject, self).form_valid(form)

    def get_success_url(self):
        project_username = self.request.user.username
        project_slug = self.object.slug
        return reverse('user_project', kwargs={'username':project_username, 'slug': project_slug})

网址

urlpatterns = patterns('',
        url(r'^$', views.index, name='index'),
        url(r'^register_profile/$', views.register_profile, name='register_profile'),
        url(r'^update_profile/$', views.update_profile, name='update_profile'),
        url(r'^create_project/$', login_required(views.CreateProject.as_view()), name='create_project'),
        url(r'^update_project/$', login_required(views.UpdateProject.as_view()), name='update_project'),
        url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'),
        url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/$', views.project_page, name='user_project'),
        )

型号

class UserProject(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    project_overview = models.CharField(max_length=1000)
    project_picture = models.ImageField(upload_to='project_images', blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    project_views = models.IntegerField(default=0)
    project_likes = models.IntegerField(default=0)
    project_followers = models.IntegerField(default=0)
    slug = models.SlugField(max_length=100, unique=True) #should this be unique or not?

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(UserProject, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title

【问题讨论】:

  • 出现错误时我试图访问的 url 是 update_project/

标签: python django django-views slug django-generic-views


【解决方案1】:

Django 的 UpdateView 默认需要来自对应 url 的 pk 或 slug 参数。在您的情况下,您需要将更新项目视图的 url 更改为

url(r'^update_project/(?P<slug>[-\w]+)/$',
    login_required(views.UpdateProject.as_view()),
    name='update_project'),

slug 是您项目的 slug。

【讨论】:

  • 嗯,我试过了,但似乎没有用。我可能做错了什么或需要改变其他东西吗?我在 UpdateView 中保留了 slug_field = 'slug'。
  • 这个url意味着你需要在UpdateProject的url中传递项目的slug。例如,如果您的项目带有 slug 'projectslug',那么这个 url 应该可以工作 update_project/projectslug/
  • 如何通过项目 slug?抱歉,我真的为此苦苦挣扎:-(
【解决方案2】:

在您的应用中创建一个 utils.py 文件。使用 django utils 中的 slugify。

import random
import string


from django.utils.text import slugify



def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
    return "".join(random.choice(chars) for _ in range(size))


def unique_slug_generator(instance, new_slug=None):
    if new_slug is None:
        slug = new_slug
    else:
        slug=slugify(instance.model field of your choice)
    Klass = instance.__class__
    qs_exists = Klass.objects.filter(slug=slug).exists()
    if qs_exists:
        new_slug = "{slug}-{randstr}".format(
            slug=slug,
            randstr=random_string_generator(size=4)
            )
        return unique_slug_generator(instance, new_slug=new_slug)
    return slug

为你的模型添加一个 slug

slug = models.SlugField(null=True, blank=True)

将其添加到您的 urls.py 文件中

url(r'^update/(?P<slug>[\w-]+)/$', profileUpdate.as_view(), name='update'),

【讨论】:

    【解决方案3】:
    class UserProject(UpdateView):
        model = BlogSlider
        fields = ['title', 'sub_title', 'description', 'image']
        template_name = 'update.html'
    

    使用表单并使用 {{ form.as_p }}。

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 2020-07-21
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多