При редактировании существующей модели Django мой метод .save() создает правильный объект, но он не сохраняется в базе данных.
У меня есть проект, в котором я хочу дать пользователям возможность обновлять некоторые поля в существующем деле, которое у них есть. Я настроил форму, и она, похоже, работает. Однако, когда я пытаюсь сохранить новую, обновленную дату, метод .save() не работает, как ожидалось. Я выполняю команду x = case.save(), и когда я распечатываю "x", я вижу ожидаемые данные, которые я ввел в форму. Однако сразу после оператора if они не сохраняются. База данных не обновляется. Мысли?
соответствующие методы в views.py:
@login_required(login_url='/accounts/login')
def stopThrough(request):
if request.method == 'POST':
c = IDForm(request.POST)
if c.is_valid():
val = c.cleaned_data['id']
urlStr = ("/polls/case/edit/" + val)
return redirect(urlStr)
cForm = IDForm
return render(request, 'caseEdit.html', {'start': True, 'cForm' : cForm })
@login_required(login_url='/accounts/login')
def caseEdit(request, id):
if request.method == 'POST':
check = CaseForm(request.POST)
print(check)
if check.is_valid():
wtf = check.save()
return redirect("/polls/case/edit/0")
c = Case.objects.get(victimID=id)
cForm = CaseForm(instance=c)
return render(request, 'caseEdit.html', {'start': False, 'cForm' : cForm })
Модель случая
class Case(models.Model):
created_date = models.DateField(auto_now_add=True)
creator = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='creator', null=True)
victimID = models.CharField(max_length=100)
#service list functions
client_intake = models.BooleanField()
client_orientation = models.BooleanField()
criminal_justice_system_based_advocacy = models.BooleanField()
crisis_intervention_or_24_hour_hotline = models.BooleanField()
dental = models.BooleanField()
education = models.BooleanField()
emotional_moral_support = models.BooleanField()
employment_assistance = models.BooleanField()
family_reunification = models.BooleanField()
financial_assistance = models.BooleanField()
housing_shelter_advocacy = models.BooleanField()
house_rental_assistance = models.BooleanField()
interpreter_translator = models.BooleanField()
legal_services_general_consultation = models.BooleanField()
legal_services_immigration = models.BooleanField()
legal_services_family_law_services = models.BooleanField()
legal_services_victims_rights_laws = models.BooleanField()
legal_services_expunging_or_sealing_criminal_records = models.BooleanField()
legal_services_employment_wage = models.BooleanField()
legal_services_public_benefits_law = models.BooleanField()
medical_case = models.BooleanField()
mental_health_treatment = models.BooleanField()
ongoing_case_management = models.BooleanField()
personal_items = models.BooleanField()
protection_safety_planning = models.BooleanField()
repatriation = models.BooleanField()
social_service_advocacy = models.BooleanField()
substance_abuse_treatment = models.BooleanField()
transportation = models.BooleanField()
other = models.BooleanField()
relevant forms.py
class IDForm(forms.Form):
id = forms.CharField(label='SurvivorID', max_length=100)
class CaseForm(ModelForm):
class Meta:
model = Case
fields = ['creator','victimID','client_intake','client_orientation','criminal_justice_system_based_advocacy','crisis_intervention_or_24_hour_hotline',
'dental', 'education','emotional_moral_support', 'employment_assistance', 'family_reunification', 'financial_assistance',
'housing_shelter_advocacy', 'house_rental_assistance', 'interpreter_translator', 'legal_services_general_consultation', 'legal_services_immigration',
'legal_services_family_law_services', 'legal_services_victims_rights_laws',
'legal_services_expunging_or_sealing_criminal_records', 'legal_services_employment_wage', 'legal_services_public_benefits_law', 'medical_case',
'mental_health_treatment', 'ongoing_case_management', 'personal_items', 'protection_safety_planning', 'repatriation',
'social_service_advocacy', 'substance_abuse_treatment', 'transportation','other']
Я попробовал использовать UpdateView вместо ручного обновления. Это дало те же результаты. Это вроде бы работало, но на самом деле не обновляло мою базу данных.
views.py
class caseedit(UpdateView):
model = Case
fields = ['creator','victimID','client_intake','client_orientation','criminal_justice_system_based_advocacy','crisis_intervention_or_24_hour_hotline',
'dental', 'education','emotional_moral_support', 'employment_assistance', 'family_reunification', 'financial_assistance',
'housing_shelter_advocacy', 'house_rental_assistance', 'interpreter_translator', 'legal_services_general_consultation', 'legal_services_immigration',
'legal_services_family_law_services', 'legal_services_victims_rights_laws',
'legal_services_expunging_or_sealing_criminal_records', 'legal_services_employment_wage', 'legal_services_public_benefits_law', 'medical_case',
'mental_health_treatment', 'ongoing_case_management', 'personal_items', 'protection_safety_planning', 'repatriation',
'social_service_advocacy', 'substance_abuse_treatment', 'transportation','other']
success_url = "/polls/case/edit/0"
- В вашем методе
stopThroughя не увидел метода сохранения после валидации формы .
- В
caseEditпередайте экземпляр вcheck = CaseForm(request.POST), чтобы он былcheck = CaseForm(request.POST, instance=c), иначе вы создаете новые объекты вместо редактирования .
Решено... Непонятный метод, на который ссылались в другом месте, имел одну единственную строку с неправильным отступом и возвращал что-то неправильное в конвейере. Если у кого-нибудь еще возникнет такая проблема... я рекомендую смотреть ВЕЗДЕ, куда идет код. Даже самые глупые вещи.