Как установить значение по умолчанию для 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, где вы можете сохранить значение.

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