Как установить значение по умолчанию для foreignkey при использовании формы?
Сценарий: Я хочу сделать приложение, которое имеет серверы (500+) в качестве модели и другую модель, которая имеет посты как внешний ключ к модели сервера для регистрации того, что мы сделали на каждом сервере.Итак, как я уже сказал, у меня есть две модели - сервер и посты.
models.py
from django.db import models
from django.db.models.deletion import CASCADE
# Create your models here.
class Cluster(models.Model):
STATUS = (
('N','Not Started'),
('I','In Porgress'),
('C','Closed'),
)
TYPE = (
('R','RDC'),
('C','CDC'),
('G','GC'),
)
cluster_code = models.CharField(max_length=250)
cluster_status = models.CharField(max_length=20,choices=STATUS)
cluster_type = models.CharField(max_length=20,choices=TYPE)
jira_link = models.CharField(max_length=250)
def __str__(self):
return self.cluster_code
class Post(models.Model):
name = models.CharField(max_length=250)
time = models.CharField(max_length=20)
cluster_log = models.TextField(null=True,blank=True)
cluster_code = models.ForeignKey(Cluster,on_delete=CASCADE)
def __str__(self):
return str(self.cluster_code) + " " + str(self.time)
class Meta:
ordering = ['-id']
Я использовал ModelForms для части приложения, посвященной постам, при создании нового поста. В идеале я хочу скрыть поле 'cluster_code' на форме. Как мне настроить его так, чтобы 'cluster_code' автоматически устанавливался на сервер, для которого я редактирую пост.
forms.py
from django.forms import ModelForm
from django import forms
from .models import Post
class PostForm(ModelForm):
class Meta:
model = Post
fields = ['name','time','cluster_log','cluster_code']
views.py
def CreateNewPost(request,cluster_code):
form = PostForm()
cluster_code = cluster_code
if request.method == 'POST':
form = PostForm(request.POST,initial={'cluster_code':cluster_code})
if form.is_valid():
form.save()
redirect('view-post')
context = {'form':form,'cluster_code':cluster_code}
return render(request,'new-post.html',context)
urls.py
from django.urls import path
from .views import GcList,ViewPost,CreateNewPost
urlpatterns = [
path('GC-list/',GcList,name='gc-list'),
path('<str:cluster_code>/',ViewPost,name='view-post'),
path('<str:cluster_code>/newpost/',CreateNewPost,name='new-post'),
]
В настоящее время, если я запускаю приложение, если я удаляю 'cluster_code' из forms.py, я получаю следующую ошибку.
Exception Type: IntegrityError
Exception Value: NOT NULL constraint failed: pages_post.cluster_code_id
Одним из способов решения этой проблемы является полное удаление cluster_code
в вашей форме:
class PostForm(ModelForm):
class Meta:
model = Post
fields = ['name','time','cluster_log']
и просто добавьте его в пост перед сохранением в базе данных:
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.cluster_code = cluster_code
post.save()
redirect('view-post')
Поскольку вы передаете код_кластера формам, вы можете написать метод init в вашей PostForm, где вы можете сохранить значение.