2015-07-22 17 views
0

我在我的web應用程序的頁面可以通過URL這樣的訪問: http://localhost:8000/organizations/list_student/?school_id=19Django的通過URL參數自定義FormMixin

我想從URL訪問school_id人之一以上形成mixin,命名爲PhoneNumberMixin(請參見下文)。能否熟悉Django的人告訴我應該如何將這個URL參數傳遞到像PhoneNumberMixin這樣的自定義表單混合中?謝謝。

models.py

class Student(models.Model): 
    school = models.ForeignKey(School) 
    phone_number = models.CharField(max_length=15, blank=True) 

urls.py

urlpatterns = patterns('', 
    # There are more, but to save space, only relevant part is included 
    url(r'^list_student/$', StudentListView.as_view(), name='list_student'), 
) 

views.py的頁面:

class StudentListView(LoginRequiredMixin, FormView): 
    form_class = SchoolAddStudentForm 
    template_name = 'organizations/list_student.html' 

    def get_success_url(self): 
     return reverse_lazy('organizations:list_student') + '?school_id=' + self.request.GET['school_id'] 

    def get_form(self, form_class): 
     request = self.request 
     return form_class(request, **self.get_form_kwargs()) 

    def get_context_data(self, **kwargs): 
     # add stuff to data to pass to HTML page here 
     return data 

    def form_valid(self, form): 
     data = form.cleaned_data 
     # save cleaned data to DB here 
     return HttpResponseRedirect(self.get_success_url()) 

forms.py

# Note PhoneNumberFormMixin below. It is used to clean phone numbers 
# such duplicate checking against the existing numbers in the DB 
class SchoolAddStudentForm(PhoneNumberFormMixin, forms.Form): 
    phone_numbers = forms.CharField(widget=forms.Textarea(attrs=form_attrs)) 

    def __init__(self, request, *args, **kwargs): 
     super(SchoolAddStudentForm, self).__init__(*args, **kwargs) 
     self.fields['phone_numbers'].label = 'Step 1 (required): Add comma-separated list of phone numbers [E.g., 5856261234, 8613910912345]:' 

mixins.py

class PhoneNumberFormMixin(object): 
    """ 
    Custom form mixin for validating phone numbers 
    """ 
    def clean_phone_numbers(self): 
     data = self.data 
     numbers = [] 

     sid = #!!!! this is where I'd like to access school_id from the URL 
     qs = Student.objects.filter(school_id=sid) 
     # do something with the qs 
     return ','.join(numbers) 

回答

1

我不知道我有一個完整的畫面,你就錯過views.py & urls.py.但通常情況下,現場清理方法應該只檢查輸入格式是否正確,實際的應用程序邏輯應該位於視圖的form_valid()方法中。 Form()方法無法正確訪問HTTP請求信息,因爲它超出了其功能範圍。

從你的觀點,你可以訪問URL參數:

self.request.GET.get('school_id', None) 

上閱讀了form_valid() - 這是你應該添加代碼將它保存之前修改對象+字段值,並/或在需要時創建相關對象。

+0

謝謝你的答案。我想檢查數據庫中是否存在'phone_number'(PhoneNumberMixin的'clean_phone_numbers')的原因是我可以引發form.ValidationError讓用戶知道。有沒有辦法在視圖中提出這樣的錯誤?我想我上面粘貼了'views.py'。我現在要添加'urls.py'。再次感謝你。 – user1330974

+1

啊,在這種情況下,您可以在您的模型字段中添加'unique = True',遷移數據庫,並且django應該處理剩下的事情。 –

+0

明白了!這可能會訣竅。如果沒有人在幾天內提供更好的替代解決方案,我會接受你的答案。謝謝! – user1330974

0

在我的用例中,我正在做一個顯示搜索結果列表的搜索。

我結束了使用此:

class SearchView(FormMixin, ListView): 

    def get_queryset(self): 
     qs = super().get_queryset() 
     # TODO implement filtering 
     return qs 

    def get_form_kwargs(self): 
     # use GET parameters as the data 
     kwargs = super().get_form_kwargs() 
     if self.request.method in ('GET'): 
      kwargs.update({ 
       'data': self.request.GET, 
      }) 

     return kwargs