2017-10-20 107 views
0

我想製作一個網站,人們可以根據他們的挑剔找到餐館和菜單項。目前,我試圖做到這一點,所以當我通過我把它關聯到用戶表單添加了一些餐館,但是當我提交表單我得到這個錯誤: IntegrityError NOT NULL約束失敗:restaurants_restaurantlocation.owner_idDjango - 爲什麼我得到這個IntegrityError:NOT NULL約束失敗:restaurants_restaurantlocation.owner_id?

這裏是我的forms.py:

from django import forms 

from .models import RestaurantLocation 

from .validators import validate_category 

class RestaurantCreateForm(forms.Form): 
name   = forms.CharField() 
location  = forms.CharField(required = False) 
category  = forms.CharField(required = False) 


def clean_name(self): 
    name = self.cleaned_data.get("name") 
    if name == "Hello": 
     raise forms.ValidationError("This is an invalid name. You stubid boy.") 
    return name 



class RestaurantLocationCreateForm(forms.ModelForm): 
#email = forms.EmailField() 
#category = forms.CharField(validators = [validate_category], required = False) 
class Meta: 
    model = RestaurantLocation 
    fields = [ 
     "name", 
     "location", 
     "category" 
    ] 

def clean_name(self): 
    name = self.cleaned_data.get("name") 
    if name == "Hello": 
     raise forms.ValidationError("This is an invalid name. You stubid boy.") 
    return name 

我的models.py:

from django.conf import settings 
from django.db import models 
from django.db.models.signals import pre_save, post_save 

from .utils import unique_slug_generator 

from .validators import validate_category 

# Create your models here. 

User = settings.AUTH_USER_MODEL 

class RestaurantLocation(models.Model): 
    owner   = models.ForeignKey(User) 
    name   = models.CharField(max_length=120) 
    location  = models.CharField(max_length=120, null=True, blank=True) 
    category  = models.CharField(max_length=120, null=True, blank=True, validators= [validate_category]) 
    slug   = models.SlugField(null=True, blank=True) 
    timestamp  = models.DateTimeField(auto_now_add=True) 
    updated   = models.DateTimeField(auto_now=True) 
    def __str__(self): 
    return self.name 


@property 
def title(self): 
    return self.name #obj.title 
def rl_pre_save_reciever(sender, instance, *args, **kwargs): 
instance.category = instance.category.capitalize() 
if not instance.slug: 
    instance.slug = unique_slug_generator(instance) 
pre_save.connect(rl_pre_save_reciever, sender=RestaurantLocation) 

我views.py:

from django.db.models import Q 
from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render, get_object_or_404 
from django.views import View 
from django.views.generic import TemplateView, ListView, DetailView, CreateView 
from django.utils.datastructures import MultiValueDictKeyError 

from .forms import RestaurantCreateForm, RestaurantLocationCreateForm 

from .models import RestaurantLocation 
# Create your views here 

def restaurant_createview(request): 
    form = RestaurantLocationCreateForm(request.POST or None) 
    errors = None 
    if form.is_valid(): 
     # customise 
     # like a pre save  
     form.save() 
     # like a post save 
     return HttpResponseRedirect("/restaurants/") 
    if form.errors: 
     errors = form.errors 

    template_name = "restaurants/form.html" 
    context = {"form" : form, "errors" : errors} 
    return render(request, template_name, context) 

def restaurant_listview(request): 
    template_name = "restaurants/restaurants_list.html" 
    queryset = RestaurantLocation.objects.all() 
    context = { 
     "object_list": queryset 
    } 
    return render(request, template_name, context) 

class RestaurantListView(ListView): 
    def get_queryset(self): 
     slug = self.kwargs.get("slug") 
     if slug: 
      queryset = RestaurantLocation.objects.filter(
       Q(category__iexact = slug) | 
       Q(category__icontains = slug) 
      ) 
     else: 
      queryset = RestaurantLocation.objects.all() 
     return queryset 

class RestaurantDetailView(DetailView): 
    queryset = RestaurantLocation.objects.all() 


class RestaurantCreateView(CreateView): 
    form_class = RestaurantLocationCreateForm 
    template_name = "restaurants/form.html" 
    success_url = "/restaurants/" 

如果您需要任何其他一段代碼,請請教,謝謝

+0

請清理你的代碼。其中一些是畸形的(缺少縮進等) – Iguananaut

回答

0

看着你RestaurantLocation模型,你有一個外鍵進入User表:

class RestaurantLocation(models.Model): 
    owner = models.ForeignKey(User) 

默認情況下,這個可以」 t是空的(這就是「非空約束」的意思)。事實上,看起來你的表單沒有做任何事情來填充餐館老闆,所以當你嘗試提交時你會得到一個數據庫約束錯誤。

"This is an invalid name. You stubid boy."

對你的用戶說不是一件好事。

相關問題