django - 需要帮助在通用 View 中获取 form_valid 的正确实例

标签 django django-models django-forms django-views django-generic-views

我无法弄清楚如何获取通用 View 的 form_valid 部分的正确实例。 我试图允许用户在他们的项目墙上发帖(有点像 Facebook)。我需要该帖子与单个项目相关(一个用户可以拥有多个项目)。实例应该是 pk 还是项目名称?任何示例代码或帮助将不胜感激!我很难理解当你创建一个新帖子时,它如何知道将自己与哪个项目相关联。

浏览次数

class NewPost(CreateView):
    model = ProjectPost
    form_class = ProjectPostForm
    template_name = 'howdidu/new_post.html'

    def form_valid(self, form):
        newpost = form.save(commit=False)
        form.instance.user = self.request.user
        newpost.save()
        self.object = newpost
        return super(NewPost, 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 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

class ProjectPost(models.Model):
    project = models.ForeignKey(UserProject)
    title = models.CharField(max_length=100)
    post_overview = models.CharField(max_length=1000)
    date_created = models.DateTimeField(auto_now_add=True)
    post_views = models.IntegerField(default=0)
    post_likes = models.IntegerField(default=0)

表格

#form to add project details
class UserProjectForm(forms.ModelForm):

    class Meta:
        model = UserProject
        fields = ('title', 'project_picture', 'project_overview')

#form to create a post
class ProjectPostForm(forms.ModelForm):

    class Meta:
        model = ProjectPost
        fields = ('title', 'post_overview')

最佳答案

好的,在这种情况下,我会推荐一个类似的 URL

url(r'^(?P<pk>\d+)/post/add/$', views.NewPostCreateView.as_view(), name='...'),

然后是这样的 View

class NewPost(CreateView):
   model = ProjectPost
   form_class = ProjectPostForm
   template_name = 'howdidu/new_post.html'

   def form_valid(self, form):
      self.object = form.save(commit=False)

      # Find project by using the 'pk' in the URL
      project = get_object_or_404(UserProject, pk=self.kwargs['pk'])

      # Then just set the project on the newPost and save()
      self.object.project = project
      self.object.save()

      return super(NewPost, self).form_valid(form)

   def get_success_url(self):
      # Unchanged ...

我在你的代码中看到你试图对用户做一些事情,但我不明白为什么你的帖子没有用户字段(你可能想要添加一个created_by)并且UserProject应该已经有一个用户设置。

我还假设用户首先进入他/她的项目,因此根据定义您知道他要添加帖子的项目是他的。如果不是这种情况,那么只需更改逻辑以通过常规查询获取 UserProject 即可。例如如果每个用户有一个项目(同样,仅作为示例),则可能使用“UserProject.objects.get(user = self.request.user)”。

无论如何,我在这里做了一些假设,但希望主要问题是如何在 newPost 上设置项目,这在我的示例中得到了回答。

关于django - 需要帮助在通用 View 中获取 form_valid 的正确实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34031309/

相关文章:

django - 在 Django 中为用户 View 重用管理表单?

django - 为什么在 Model.full_clean 中 clean_fields 在 clean 之前被调用?

python - 对于从 CreateView 创建新帐户的新用户,将 is_staff 设置为 true

django-forms - Django 表单 : A Beginners Guide

django - 属性错误: '__proxy__' object has no attribute 'set_attributes_from_name' when using ArrayField in Django

html - Django 服务 CSS 和 HTML

django - 直接将 AWS ELB 与 Gunicorn(无 nginx)一起使用有哪些缺点?

python - Django 检索模型的所有相关属性

python - 只从 django Manytomany 中取出一项

python - Django 如何覆盖默认表单错误消息