2017-06-20 6 views
0

管理インターフェースでモデルの追加ボタンをカスタマイズしようとしています。これを行うために、私はこのモデルの管理者モデルを書いて、add_viewの定義を上書きしようとしました。しかし、私はエラーにアドミニストレーションモデルにフォームを追加すると、多対多のエラーが発生する - このフォームでこの問題が発生する理由

"<modelStudent: Student:>" needs to have a value for field "modelstudent" before this many-to-many relationship can be used. 

を取得していますこれは私のモデル

class modelStudent(models.Model): 
    user    = models.OneToOneField(User, on_delete=models.CASCADE,null=True, blank=True) 
    school   = models.ForeignKey(modelSchool) 
    first_name  = models.CharField(max_length=128, unique=False) 

であり、これはそのモデルの管理モデル

class modelStudentAdmin(admin.ModelAdmin): 
    form = adminStudentForm 


    def get_queryset(self, request): 
     qs = super(modelStudentAdmin, self).get_queryset(request) 

     if request.user.is_superuser: 
      return qs 
     else: 
      schoolInstance = modelSchool.objects.get(user=request.user) 
      qs = modelStudent.objects.filter(school=schoolInstance) 
      return qs 


    def add_view(self, request, form_url='', extra_context=None): 
     if request.user.is_superuser: 
      return super(modelStudentAdmin,self).add_view(request,form_url,extra_context) 

     elif request.method == 'POST': 
      form = UploadFileForm(request.POST,request.FILES) 
      if form.is_valid(): 
       email = form.cleaned_data["send_email"] 
       handle_uploaded_file(request.FILES['file'],request) 
       return HttpResponseRedirect('/admin/') 
     else: 
      form = UploadFileForm() 
     return render(request, 'upload.html', {'form': form}) 

私はこの問題は、フォームの割り当てであると信じていますform = adminStudentForm ここにadminStudentFormがあります

class adminStudentForm(forms.ModelForm): 
    class Meta: 
     model = modelStudent 
     fields = '__all__' 

    patients = forms.ModelMultipleChoiceField(queryset=modelPatient.objects.all()) 

    def __init__(self, *args, **kwargs): 
     super(adminStudentForm, self).__init__(*args, **kwargs) 
     if self.instance: 
      self.fields['patients'].initial = self.instance.modelpatient_set.all() 

    def save(self, *args, **kwargs): 
     try: 
      instance = super(adminStudentForm, self).save(commit=False) 
      patients_qset = self.cleaned_data['patients'] 
      for pqset in patients_qset: 
       pqset.student.add(instance) 

     except Exception as e: 
      print(e) 
      raise 
     return instance 
ここで

はmodelPatient

class modelPatient(models.Model): 
      student   = models.ManyToManyField(modelStudent,null=True,default=None,blank=True) 
      patient_name  = models.CharField(max_length=128, unique=False) 
     patient_age  = models.IntegerField(default=0) 

がなぜ問題を引き起こすこちらのフォームを追加しないのですか?どのように私はこの問題を解決することができますか?

答えて

0

多分これをモデルの下に置くと?わかりませんが、試してみる価値があります。

def __str__(self): 
    return(self.user) 
関連する問題