Я создал блог журнала обучения, следуя ускоренному курсу Python, и заметил, что есть некоторые темы, которые мне не нужны.Поэтому я использовал learning_log.objects.filter (id = id number) .delete () в оболочке python manage.py для удаления некоторых дублирующих элементов.Затем я попытался добавить новые темы и получил эту ошибку:
Ошибка IntegrityError в / new_topic / NOT NULL не выполнена: learning_logs_topic.owner_id
В файле models.py я попытался передать значение по умолчанию ='' to text = models.TextField (), передавая null = True, пусто = True для models.TextField, выполняя manage.py makemigrations - fake и повторно запуская makemigrations / migrate.Но, похоже, ничего не решает эту проблему.Я пытаюсь избежать удаления своей базы данных и запуска заново, но я думаю, что это может быть единственным решением.
* ОБНОВЛЕНИЕ
Прочитайте документацию ForeignKey и замените "on_delete = models.CASCADE"с помощью "models.SET_NULL, blank = True, null = True", перезапустите миграцию и теперь можете успешно добавлять другие темы / записи.
Models.py
from django.db import models
from django.contrib.auth.models import User
class Topic(models.Model):
"""A topic the user is learning about."""
id = models.IntegerField(primary_key=True)
text = models.CharField(max_length=200,default=" ")
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
"""Returning a string represetation of the model."""
return self.text
class Entry(models.Model):
"""Something specific learned about a topic."""
id = models.IntegerField(primary_key=True) #added after deleting topic and getting error
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
text = models.TextField(null=True,blank=True)
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""Return a string representation of model"""
if len(self.text) > 50:
return self.text[:50] + '...'
else:
return self.text
Views.py
def index(request):
'''The home page for Learning Log'''
return render(request, 'learning_logs/index.html')
def topics(request):
"""Show all topics"""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request, topic_id):
'''Show all topics and all its entries.'''
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
def new_topic(request):
'''Add a new topic'''
if request.method != 'POST':
# No data submitted, create a blank form
form = TopicForm()
else:
# POST data submitted, processes data
form = TopicForm(data=request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
new_topic.html
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Add a topic:</p>
<form action="{% url 'learning_logs:new_topic' %}"method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit"> add topic</button>
</form>
{% endblock content %}
Ожидаемый результат - нажать«Добавить новую тему», введите тему в текстовое поле, нажмите «Добавить тему», чтобы вернуться на страницу «Темы» с недавно добавленной темой в списке.