2016-04-26 5 views
0

У меня есть база данных клиентов и процедур, каждый клиент может иметь несколько процедур. Проблема заключается в том, что обработка теряет значение Customer в БД, а вместо идентификатора клиента значение просто NULL.Модель Django теряет свои отношения ForeignKey пока форма сохраняется

это происходит в следующем коде:

def get_treatment(request, treatment_id): 
    customer = Treatment.objects.get(id=treatment_id).customer 
    if request.POST: 
     form = TreatmentForm(request.POST, instance=Treatment.objects.get(id=treatment_id)) 
     if form.is_valid(): 
      form.save() #***This is where it happens*** 
      return HttpResponseRedirect('/') 
    else: 
     form = TreatmentForm(instance=Treatment.objects.get(id=treatment_id)) 

    return render_to_response('new_treatment.html', 
         {"form"    : form, 
         "customer_name"  : customer, 
         }, 
         RequestContext(request)) 

Может кто-нибудь объяснить это странное поведение?

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     fields = "__all__" 

    BOOL_CHOICES = (
     (True, 'has'), 
     (False, 'none') 
    ) 

    customer = forms.ModelChoiceField(queryset=Customer.objects.all(), widget=forms.RadioSelect(renderer=HorizontalRadioRenderer), required=False) 

    # Looking inspections 
    skin_hue_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinHue.objects.all(), initial=0) 
    skin_hue_area = forms.CharField(max_length=200, required=False) 
    skin_hue_comments = forms.CharField(max_length=200, required=False) 
    skin_color_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinColor.objects.all(), initial=0) 
    skin_color_area = forms.CharField(max_length=200, required=False) 
    skin_color_comments = forms.CharField(max_length=200, required=False) 
    pores_finding = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=Pores.objects.all(), initial=0) 
    pores_area = forms.ModelMultipleChoiceField(queryset=GlobalArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    pores_comments = forms.CharField(max_length=200, required=False) 
    comdones_finding = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES)) 
    comdones_area = forms.ModelMultipleChoiceField(queryset=GlobalArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    comdones_comments = forms.CharField(max_length=200, required=False) 
    wrinkles_finding = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    wrinkles_area = forms.ModelMultipleChoiceField(queryset=WrinklesArea.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=False) 
    wrinkles_mimics = forms.BooleanField(required=False) 
    wrinkles_age = forms.BooleanField(required=False) 
    wrinkles_comments = forms.CharField(max_length=200, required=False) 

    # Touching 
    muscle_tonus = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=MuscleTonus.objects.all(), initial=0) 
    skin_torgor = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinTorgor.objects.all(), initial=0) 
    skin_thinkness = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinThickness.objects.all(), initial=0) 
    skin_touch = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinTouch.objects.all(), initial=0) 

    # Skin Problems 
    papules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    papules_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    papules_comments = forms.CharField(max_length=200, required=False) 

    postules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    postules_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    postules_comments = forms.CharField(max_length=200, required=False) 

    scars = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    scars_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=SkinProblemAreas.objects.all(), required=False, initial=0) 
    scars_comments = forms.CharField(max_length=200, required=False) 

    malium = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    malium_area = forms.ModelChoiceField(widget=RadioSelect(renderer=HorizontalRadioRenderer), queryset=MaliumAreas.objects.all(), required=False) 
    malium_comments = forms.CharField(max_length=200, required=False) 

    pigmentation = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    pigmentation_area = forms.CharField(max_length=200, required=False) 
    pigmentation_comments = forms.CharField(max_length=200, required=False) 

    nebuses = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    nebuses_area = forms.CharField(max_length=200, required=False) 
    nebuses_comments_color = forms.CharField(max_length=200, required=False) 
    nebuses_comments_hair = forms.CharField(max_length=200, required=False) 

    macules = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    macules_area = forms.CharField(max_length=200, required=False) 
    macules_comments = forms.CharField(max_length=200, required=False) 

    hypermia = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    hypermia_area = forms.CharField(max_length=200, required=False) 
    hypermia_comments = forms.CharField(max_length=200, required=False) 

    coproz = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    coproz_area = forms.CharField(max_length=200, required=False) 
    coproz_comments = forms.CharField(max_length=200, required=False) 

    hersotism = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    hersotism_area = forms.CharField(max_length=200, required=False) 
    hersotism_comments = forms.CharField(max_length=200, required=False) 

    other_problems = forms.NullBooleanField(widget=RadioSelect(renderer=HorizontalRadioRenderer, choices=BOOL_CHOICES), required=True) 
    other_problems_area = forms.CharField(max_length=200, required=False) 
    other_problems_comments = forms.CharField(max_length=200, required=False) 

    skin_diagnosis = forms.ModelMultipleChoiceField(queryset=DiagnosisCategory.objects.all(), widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer), required=True) 
    diagnosis_comment = forms.CharField(widget=forms.TextInput(attrs={'size':55}), max_length=200, required=False) 

    treatment_purpose = forms.CharField(widget=forms.TextInput(attrs={'size':55}), max_length=200) 
    customer_guidance = forms.CharField(widget=forms.Textarea(), max_length=200, required=False) 
    customer_recommendations = forms.CharField(widget=forms.Textarea(), max_length=200, required=False) 

    next_treatment_date = forms.DateField(required=True, input_formats=["%d-%m-%Y"], widget=forms.DateInput(format='%d-%m-%Y')) 
    next_treatment_comments = forms.CharField(widget=forms.Textarea(), max_length=200, required=True) 

    def __init__(self, *args, **kwargs): 
     super(TreatmentForm, self).__init__(*args, **kwargs) 
     self.fields["next_treatment_date"].widget.attrs["class"] = "datepicker" 

    def clean(self): 
     cleaned_data = super(TreatmentForm, self).clean() 
     validation_dict = {} 
     data = self.cleaned_data 

     if data.get("comdones_finding") == True and len(data.get("comdones_area")) == 0: 
      validation_dict["comdones_area"] = ["This field is required",] 

     # Check Boolean fields 
     if data.get("comdones_finding") is None: 
      validation_dict["comdones_finding"] = ["This field is required",] 
     if data.get("wrinkles_finding") is None: 
      validation_dict["wrinkles_finding"] = ["This field is required",] 
     if data.get("papules") is None: 
      validation_dict["papules"] = ["This field is required",] 
     if data.get("postules") is None: 
      validation_dict["postules"] = ["This field is required",] 
     if data.get("scars") is None: 
      validation_dict["scars"] = ["This field is required",] 
     if data.get("malium") is None: 
      validation_dict["malium"] = ["This field is required",] 
     if data.get("pigmentation") is None: 
      validation_dict["pigmentation"] = ["This field is required",] 
     if data.get("nebuses") is None: 
      validation_dict["nebuses"] = ["This field is required",] 
     if data.get("macules") is None: 
      validation_dict["macules"] = ["This field is required",] 
     if data.get("hypermia") is None: 
      validation_dict["hypermia"] = ["This field is required",] 
     if data.get("coproz") is None: 
      validation_dict["coproz"] = ["This field is required",] 
     if data.get("hersotism") is None: 
      validation_dict["hersotism"] = ["This field is required",] 
     if data.get("other_problems") is None: 
      validation_dict["other_problems"] = ["This field is required",] 

     if validation_dict: 
      raise forms.ValidationError(validation_dict)  

     return data 
+4

Пожалуйста, покажите 'ЛечениеФорма' – Alasdair

+0

Образовательная форма была добавлена ​​ –

+0

Является ли клиент определенно выбранным при отправке формы? У вас есть 'required = False', что означает, что« клиент »должен« Нет ». У вас все еще возникает проблема, если вы удалите 'customer = forms.ModelChoiceField()' из формы и пусть Django автоматически отображает его? – Alasdair

ответ

0

Я предполагаю, что вы не отправляете значение для клиента при отправке формы. Пустое значение является допустимым, поскольку у вас есть required=False. Поэтому Django устанавливает заказчик до None, когда форма сохраняется.

Если вы не хотите, чтобы поле customer было редактируемым, вы не должны включать его в форму вообще. Вы можете сделать это, используя exclude.

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     exclude = ['customer'] 

Использование exclude может быть немного опасным. Существует риск того, что вы добавите частное поле в модель в будущем, и оно автоматически добавится в форму, потому что вы забыли добавить его в exclude. Вы можете установить fields вместо этого, и оставьте customer.

class TreatmentForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 
     fields = ['skin_hue_finding', 'skin_hue_area', ... <all other fields>] 

Однако вы можете не захотеть этого делать, потому что у вас много полей.

+0

Спасибо, но это частично решило мою проблему: Устранена проблема, когда я хотел отредактировать существующее обращение (экземпляр лечения уже существует), но не тогда, когда я хочу добавить новое лечение. Есть ли способ установить поле условного исключения, если экземпляр уже существует? –

+0

Это звучит как другая проблема, поэтому вам лучше задать новый вопрос. Вместо того, чтобы устанавливать условное выражение, я думаю, вам будет лучше иметь две отдельные формы с разными значениями для 'fields' или' excludes'. Чтобы предотвратить дублирование, одна форма может наследовать другую, или они могут наследоваться от базового класса. – Alasdair

Смежные вопросы