2013-01-11 21 views
0

我被困在試圖保存從另一個模型的外殼作爲外鍵獲取的模型實例。保存一個django對象從一個表格獲取另一個模型實例作爲外鍵

模型

class Customer(models.Model): 
    owner = models.ForeignKey(User) 
    custname = models.CharField() 

class Appointment(models.Model): 
    user = models.ForeignKey(User) 
    start = models.DateTimeField() 
    end = models.DateTimeField() 
    customer = models.ForeignKey(Customer) 

形式

class AppointmentForm(forms.Form): 
    basedate = forms.DateField() 
    start = forms.TimeField(widget=forms.Select()) 
    end = forms.IntegerField(widget=forms.Select()) 
    customer = forms.ModelMultipleChoiceField(queryset=Customer.objects.all()) 

,我是不是能夠得到一個通用的FormView工作的方法:

def form_valid(self, form): 
    if form.is_valid(): 
     appointment = Appointment() 
     appointment.user = self.request.user 
     basedate = form.cleaned_data['basedate'] 
     start = form.cleaned_data['start'] 
     duration = form.cleaned_data['end'] 
     appointment.start = datetime.datetime.combine(basedate, start) 
     appointment.end = appointment.start + datetime.timedelta(minutes=duration) 
     appointment.save() 
     return super(AppointmentCreate, self).form_valid(form) 

,我應該在最後添加什麼方法從窗體中讀取外鍵客戶,並將其傳遞給約會?是否有任何過濾方式,以便在表單中只顯示屬於request.user的用戶?

非常感謝您的幫助。

回答

1

像這樣的東西應該工作。幾件事:

1)我改變了表單字段爲ModelChoiceField而不是多選。您需要使用ModelChoiceField來顯示關係。我從MultipleChoice改變了這一點,因爲根據你的模型,你只想保存一個選擇。您可以在這裏閱讀更多有關ModelChoiceField的信息:https://docs.djangoproject.com/en/dev/ref/forms/fields/

2)在您的表格中,我將選擇查詢更改爲customer = forms.ModelChoiceField(queryset=Customer.objects.filter(owner=request.user)。這將僅針對特定用戶的客戶進行過濾。

forms.py

class AppointmentForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(AppointmentForm, self).__init__(*args, **kwargs) 

    basedate = forms.DateField() 
    start = forms.TimeField(widget=forms.Select()) 
    end = forms.IntegerField(widget=forms.Select()) 
    customer = forms.ModelChoiceField(queryset=Customer.objects.filter(owner=request.user)) 

views.py

def form_valid(self, form): 
    if request.method=='POST': 
     form = AppointmentForm(request.POST, request=request) 
     if form.is_valid(): 
      appointment = Appointment() 
      appointment.user = self.request.user 
      basedate = form.cleaned_data['basedate'] 
      start = form.cleaned_data['start'] 
      duration = form.cleaned_data['end'] 
      appointment.customer = form.cleaned_data['customer'] 
      appointment.start = datetime.datetime.combine(basedate, start) 
      appointment.end = appointment.start + datetime.timedelta(minutes=duration)  
      appointment.save() 
      return super(AppointmentCreate, self).form_valid(form) 
    else: 
     form = AppointmentForm() 
+0

現在我可以保存約會的實例,謝謝。但有兩個問題:在表單中,不允許使用request.user,因此我無法過濾當前用戶的客戶。 ¿是否有其他方法可以做到這一點?而對於ModelChoiceField,doc應該避免超過100種不同的選擇。這裏最好的方法是什麼? – user1971044

+0

這是什麼阻止你使用request.user?如果您收到錯誤,請發佈。至於ModelChoiceField - 它是'選擇'小部件,不建議超過100種不同的選擇,而不是字段本身。選擇小部件是您在表單HTML頁面上使用的選項。有各種各樣的方法 - 修改選擇小部件,使用jQuery選擇小部件等。https://docs.djangoproject.com/en/dev/ref/forms/widgets/ –

+0

瞭解選擇小部件。關於表單問題,當您嘗試您的建議時,我會得到:_Exception值:\t名稱'請求'未定義_。我認爲這樣做的方式可能會覆蓋表單類的'_init_'方法,但我無法使其工作。再次,我感謝幫助。 – user1971044

0

最後我做到了。關鍵是要覆蓋FormView控件類的得到方法views.py,而不是在forms.py修改INIT

forms.py:

class AppointmentForm(forms.Form): 
    basedate = forms.DateField() 
    start = forms.TimeField(widget=forms.Select()) 
    end = forms.IntegerField(widget=forms.Select()) 
    customer = forms.ModelChoiceField(queryset=Customer.objects.all()) 
    ... 

views.py:

def get(self, request, *args, **kwargs): 
     """ 
     Handles GET requests and instantiates a blank version of the form. 
     """ 
     choices_start, choices_duration = self._get_choices() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     form.fields['start'].widget=forms.Select(choices=choices_start) 
     form.fields['end'].widget=forms.Select(choices=choices_duration) 
     form.fields['customer'].queryset=Customer.objects.filter(owner=request.user) 
     return self.render_to_response(self.get_context_data(form=form)) 

@Dan:非常感謝您的幫助。

相關問題