2010-06-11 92 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