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