【问题标题】:Django m2m form appearing fieldsDjango m2m 表单出现字段
【发布时间】:2011-03-02 19:37:47
【问题描述】:

我有一个课堂应用程序和一个关注关系。用户可以互相关注,也可以创建教室。用户创建教室时,只能邀请关注他的人。 Classroom 模型是一个 m2m 到 User 表。

我有模型。 py:

class Classroom(models.Model):
     creator = models.ForeignKey(User)
     classname = models.CharField(max_length=140, unique = True)
     date = models.DateTimeField(auto_now=True)
     open_class = models.BooleanField(default=True)
     members = models.ManyToManyField(User,related_name="list of invited members")

并在以下应用程序的 models.py 中:

class Relations(models.Model):    
    initiated_by = models.ForeignKey(User, editable=False)
    date_initiated = models.DateTimeField(auto_now=True, editable = False)
    follow = models.ForeignKey(User, editable = False, related_name = "follow") 
    date_follow = models.DateTimeField(auto_now=True, editable = False)

在课堂应用的views.py中:

def save_classroom(request, username):

   if request.method == 'POST':
        u = User.objects.get(username=username)
        form = ClassroomForm(request.POST, request.FILES) 
        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.creator = request.user 
           r = Relations.objects.filter(initiated_by = request.user)
         #  new_obj.members = 
           new_obj.save()
           return HttpResponseRedirect('.')    
   else:
           form = ClassroomForm()     
   return render_to_response('classroom/classroom_form.html', {
           'form': form,

           }, 
          context_instance=RequestContext(request))  

我使用 ModelForm 作为课堂表单,考虑到我与用户表的多对多关系,在字段成员中,默认视图是我数据库中所有用户的列表。 但我只希望在该列表中与登录用户有关注关系的用户 - 创建教室的用户。 我该怎么做?

ps:另外,当我保存表单时,它会保存,但没有“成员”

谢谢!

【问题讨论】:

  • 你想要那个列表在哪里,在 django admin 中?还是在模板中?

标签: django forms m2m


【解决方案1】:

您必须更改用于填充表单域的查询集...将以下内容放入您的表单类中:

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(ClassroomForm, self).__init__(*args, **kwargs)
        relations = Relations.objects.filter(initiated_by=user)
        self.fields["members"].queryset = \
            User.objects.filter(pk__in=[r.follow.pk for r in relations])

要让当前用户进入表单的__init__ 方法,请在save_classrom 视图中更改其初始化:

        form = ClassroomForm(request.POST, request.FILES, user=request.user) 
        # and after the else:
        form = ClassroomForm(user=request.user)     

我不太确定为您的字段获取用户的查询,但我认为应该检查 Initial_by 是登录用户吗?

要保存 m2m 关系,您还必须致电 form.save_m2m()

【讨论】:

  • 是的,initiated_by 应该是当前登录的用户。非常感谢您的回答。我现在就试试这个方法
  • 好吧,正如我所说,我对查询并不完全确定,但我认为如果我能正确获取该用户的关系,然后在“关注”中获取该用户“关系应该是正确的方式?您还应该在相关名称中不使用空格(改用下划线)。而“follow”的相关名称应该更像“relations”(这样 user.relations.all() 将返回他的所有关系)?
  • 无论如何,我遇到了一个奇怪的错误:首先,我在 def init 中添加了 request 作为参数,对于其他方式 request.pop('user')没有被认可。但是现在,即使我在视图表单 = ClassroomForm(user=request.user) 之后包含了“else”,它也给了我错误:__init__() 至少需要 2 个非关键字参数(1 个给定)
  • 然后,我如何定义当前登录的用户,以便在 init 中识别我的:initialized_by=user?谢谢!
  • 我编辑了上面的例子,实际上它现在应该可以工作了!如果不告诉我问题是什么!
猜你喜欢
  • 2020-03-30
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多