Как добавить данные в Django?

Это текст мемо, где пользователь может отправить свою форму мемо. Мне нужно добавить (обновить) новое сообщение в эту запись через кнопку Update в DJANGO. Кстати, я использовал PK и FK таблицы базы данных.

Как я могу его изменить?

Tks.

Сообщение об ошибке :

IntegrityError at /addshowmemo/72/ (1048, "Column 'software_id' cannot be null")

Метод запроса: POST URL запроса:/127.0.0.1/addshowmemo/72/ Django Версия: 3.1.5 Тип исключения: IntegrityError Значение исключения: (1048, "Column 'software_id' cannot be null") Exception Расположение: d:\project\python\it\venv\lib\site-packages\django\db\backends\mysql\base.py, строка 78, в execute Python Исполняемый файл: d:\project\python\it\venv\Scripts\python.exe Python Версия: 3.10.2 Python Путь: ['D:\project\python\it', 'C:\Users\tou52\.vscode\extensions\ms-python.python-2022.4.1\pythonFiles\lib\python\debugpy\_vendored\pydevd', 'C:\Users\tou52\AppData\Local\Programs\Python\Python310\python310.zip', 'C:\Users\tou52\AppData\Local\Programs\Python\Python310\DLLs', 'C:\Users\tou52\AppData\Local\Programs\Python\Python310\lib', 'C:\Users\tou52\AppData\Local\Programs\Python\Python310', 'd:\project\python\it\venv', 'd:\project\python\it\venv\lib\site-packages']

Модели:

class Memo(models.Model):
notes = models.TextField()
software = models.ForeignKey(Software, on_delete=models.CASCADE)
timestamp = models.DateTimeField(default=timezone.now)

def __str__(self):
    return self.notes

class Software(models.Model):
STATUS_CHOICES = [
    (0, 'Planning'),
    (1, 'Development'),
    (2, 'Using'),
    (3, 'Obsolete')
]
name = models.CharField(max_length=100, verbose_name="SysName")
url = models.CharField(max_length=100, verbose_name="SysAdd")
status = models.PositiveIntegerField(default=0, choices=STATUS_CHOICES,  verbose_name="Status") 
company = models.ForeignKey(Company, on_delete=models.CASCADE,  verbose_name="Company")
team = models.ForeignKey(Team, on_delete=models.DO_NOTHING,  verbose_name="Team")
def __str__(self):
    return self.name

Шаблоны:

<form method="POST" name="myform" action="." >
{% csrf_token %}
<table class="table table-striped">
  <tr>
     <td align=right>Memo:</td>
      <td>
            <input type=text size=50 name="Cmemo" value='{{Nmemo.notes}}'>
    </td>
  </tr>
<tr>
    <td> </td>
<td>
    <input type=submit value="Confirm" class="btn btn-primary">||<a href='/showall/' class="btn btn-warning">Home</a>
</td>
<td></td>
</tr>

просмотров:

def add_showmemo(request,id=None,logmemo=None):
memos = Memo.objects.all()
if request.method=="POST":
    Cmemo = request.POST.get('Cmemo')
    Nmemo = Memo(notes=Cmemo)
    Nmemo.save()     
    return redirect("/showdetail/")
return render(request, "add_showmemo.html", locals())

db база данных:

Memo db

id/notes/timestamp/software_id
 1/xxx/2022-01-02/32
 2/ooo/2022-01-03/31
 3/yyy/2022-01-04/40
 4/vvv/2022-01-05/1
 5/sss/2022-01-06/2

SoftWare db

id/name/url/company_id/status/team_id
 1/watch/NA/9/1/8
 2/shoes/NA/10/2/8
 3/pen/NA/10/7/2/8
 4/apple/NA/7/2/9
 5/phone/NA/4/0/6

Проблема здесь в том, что у вас есть внешний ключ к software, который не может быть null

software = models.ForeignKey(Software, on_delete=models.CASCADE)

поэтому, когда вы сохраняете заметку без прикрепленного software - она попадает под ограничение базы данных о не нулевом поле.

Таким образом, у вас есть два варианта:

  1. Если программное обеспечение не обязательно должно быть на памятке - сделайте его недействительным:

    software = models.ForeignKey(Software, on_delete=models.SET_NULL, null=True, blank=True)
    
  2. Или если оно действительно должно быть там - найдите соответствующее программное обеспечение и прикрепите его к memo в views.py. Например:

     Cmemo = request.POST.get('Cmemo')
    
     software = Software.objects.get(id=request.POST.get('software_id')
    
     Nmemo = Memo(notes=Cmemo, software=software)
     Nmemo.save()     
    

Вы также можете изучить формы Django - там это будет более просто и "автоматически" без необходимости извлекать поля по одному.

Вернуться на верх