2010-06-11 88 views
1

我有一个课堂应用程序和一个关注关系。用户可以相互关注并创建教室。当用户创建教室时,他只能邀请跟随他的人。 教室模型是用户表的m2m。Django m2m窗体出现字段

我有模特。潘岳:

,并在后续应用的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课堂形式和默认视图,考虑到我与用户表的多对多关系,在成员字段中,是我数据库中所有用户的列表。 但我只希望在该列表中与登录用户建立关系的用户 - 创建教室的用户。 我该怎么做?

P.S:同样,当我保存表单,这样可以节省,但没有 “成员”

谢谢!

+0

你想在django管理员列表中的位置?或在模板中? – eos87 2010-06-11 22:39:13

+0

在模板:) – dana 2010-06-12 07:18:37

回答

1

你必须改变用来填充formfield的查询集...把下面的表单中的类:

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__方法,改变其在initsialisation您save_classrom观点:

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

我不太清楚有关查询,以获得用户为你的领域,但我认为它应该检查发现initiated_by被登录的用户?

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

+0

是的,initiate_by应该是当前登录的用户。非常感谢答案。我现在就试试这个方法 – dana 2010-06-12 13:36:58

+1

就像我说的,我对查询并不完全确定,但我认为如果我得到正确的关系为这个用户,然后把用户,然后在那里的“遵循“关系应该是正确的方式? YOu也应该在相关名称中不使用空格(使用下划线代替)。而“follow”的相关名称应该更像“关系”(这样user.relations.all()将返回所有关系)? – 2010-06-12 14:00:55

+0

无论如何,我有一个奇怪的错误:首先,我已经添加请求作为def __init__中的参数,为其他方式request.pop('用户')无法识别。但是现在,尽管我在视图窗体中的'else'之后包含了一个ClassroomForm(user = request.user),但它给了我一个错误:__init __()至少需要2个非关键字参数(给出1) – dana 2010-06-14 12:15:18