【问题标题】:django form not saving on postgresql but does save to sqlitedjango 表单不保存在 postgresql 上,但保存到 sqlite
【发布时间】:2022-01-12 23:26:10
【问题描述】:

我已将项目部署到 Heroku。我正在为我的数据库使用 postgresql。

使用 acct_no 作为外键将作业附加到客户表。我可以使用 postgresql 创建客户,但无法创建工作。

我可以使用 sqlite 创建作业,但是当我尝试使用 postgresql 数据库时,createview 不会创建作业并将我重定向到我的主页。我对 django 还很陌生,我曾尝试在此处寻找类似的问题,但未能找到解决方案。

models.py

class Jobs(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase.
    acct_no = models.ForeignKey(Customers, on_delete=models.CASCADE, default=1000000, db_column='ACCT_NO')  # Field name made lowercase.
    foreman = models.CharField(db_column='FOREMAN', max_length=45, blank=True, null=True)  
    comments = models.CharField(db_column='COMMENTS', max_length=255, blank=True, null=True)  # Field name made lowercase.

views.py

class JobCreateView(CreateView):
    model = Jobs
    template_name = 'new_job.html'
    form_class = JobForm


    def get_initial(self):
        initial = super(JobCreateView, self).get_initial()
        initial['acct_no'] = Customers.objects.get(pk = self.kwargs['pk'])
        return initial


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        customer = Customers.objects.get(pk = self.kwargs['pk'])
        context["customer"] = customer
        return context


    def get_success_url(self):
        return reverse_lazy('CustomerView', kwargs = {'pk':self.kwargs['pk']})

forms.py

class JobForm(forms.ModelForm):
    class Meta:
        model = Jobs
        fields = ['acct_no', 'job_type', 'estimatedate', 'estimatetime', 'vacant', 'year_built', 'comments']

        labels = {
            'job_type' : 'Job Type* ',
            'estimatedate' : 'Estimate Date', 
            'estimatetime' : 'Estimate Time'
        }

        widgets = {
            'acct_no' : forms.HiddenInput(attrs={'class' : 'form-control form-select' }), # foreign key
            'job_type' : forms.Select(choices = JOBS, attrs={'class' : 'form-control form-select' }),
            'estimatedate' : widgets.DateInput(attrs={'type' : 'date', 'class' : 'form-control'}),
            'estimatetime' : widgets.TimeInput(attrs={'type' : 'time', 'class' : 'form-control'}),
            'vacant' : forms.Select(choices = CHOICES,attrs={'class' : 'form-control form-select' }),
            'year_built' : forms.Select(choices = YEAR_LIST, attrs={'class' : 'form-control form-select' }),
            'comments' : forms.Textarea(attrs={'class' : 'form-control'})
        }

urls.py

path('new_job/<pk>', my_login_required(JobCreateView.as_view()), name = 'new_job'),

**编辑

settings.py

import os
from pathlib import Path
import django_js_reverse


BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = '***'

DEBUG = False

ALLOWED_HOSTS = ['***', 'localhost']

INSTALLED_APPS = [

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'customers',
    'jobs',
    'django_js_reverse',
    'simplejson',
    'rest_framework'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django_session_timeout.middleware.SessionTimeoutMiddleware'
]

ROOT_URLCONF = '***'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

            ],
        },
    },
]

WSGI_APPLICATION = '***'


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '***',
        'USER': '***',
        'PASSWORD': '***',
        'HOST': '***',
        'PORT': '***',
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


这是我在这里提出的第一个问题,所以如果我没有提供足够的信息,请告诉我,我会添加任何需要的内容。感谢您的任何帮助或想法!

【问题讨论】:

  • 将您的 settings.py 添加到您的问题中。
  • 好的,谢谢,添加了 settings.py

标签: python django postgresql sqlite django-class-based-views


【解决方案1】:

我相信您的 settings.py 文件可能缺少 Heroku 连接数据库所需的内容。这是假设您的 Heroku 数据库凭据与您在数据库配置中隐藏的值(“***”)匹配。

    DATABASES = {
        'default': {
            ...
            'CONN_MAX_AGE': 500
            ...

    import dj_database_url
    DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True)

如果您使用的是dj-database-url

来源:Heroku

编辑:

尝试从 JobForm 中删除“acct_no”,因为它是隐藏输入。然后尝试使用 form_valid 代替 get_initial 方法:

    def form_valid(self, form):
        customer = Customers.objects.get(pk = self.kwargs['pk'])
        form.instance.acct_no = customer
        return super(JobCreateView. self).form_valid(form)

来源:Django CreateView get_initial Foreign Key

【讨论】:

  • 我添加了“conn_max_age”,但仍然遇到同样的问题。我能够创建客户没问题,问题似乎是使用外键创建任何东西。
  • 我遇到了一个可能有帮助的类似问题,并更新了我的答案。对不起,我没有想法。 Heroku 显然正在连接到您的 postgres 数据库,否则您也无法创建客户。希望你能成功。
  • 我进行了您建议的更改,但仍然无法正常工作。它最终成为作业模型中的一个问题,其中主键设置为整数字段而不是自动字段,并且将 ID 列设置为空。您提供的来源帮助解决了这个问题。感谢您的帮助!
  • 很高兴您可以使用它,感谢您告诉我!
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 2014-05-19
  • 2017-04-18
  • 2014-02-01
  • 1970-01-01
  • 2017-11-09
  • 2012-07-16
相关资源
最近更新 更多