0

我一直在試圖把一個解決方案,這用盡了所有的途徑,但我目前Python和Django的知識只能讓我至今。Null值違反非空約束在Django 1.9

我創建一個基本的票務系統和CreateView的用於工作,直到我創建了一個剖面模型,然後分離票務模型到它自己的應用程序。當我重構我的代碼時,已經創建了一些票據,這就是爲什麼我知道ListView的工作原理,DeleteView的工作原理以及DetailView的原理。 CreateView的作品,直到我點擊保存按鈕。

我的視圖和模型都低於;我希望有人能幫我解決這個問題。

票務型號

from django.db import models 
from django.contrib.auth.models import User 
.... 
from qcapp.models import Profile 


class Ticket(models.Model): 
    # Relations 
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="tickets", verbose_name="user") 
    # Attributes 
    title = models.CharField(max_length=250, verbose_name="Title", help_text="Enter a Ticket Title") 
    color = models.CharField(max_length=7, 
          default="#ffffff", 
          validators=[RegexValidator("(^#[0-9a-fA-F]{3}$)|(^#[0-9a-fA-F]{6}$)")], 
          verbose_name="Color", 
          help_text="Enter the hex color code, like #ccc or #cccccc") 
    description = models.TextField(max_length=1000) 
    created_date = models.DateTimeField(default=timezone.now, verbose_name='Created Date') 
    created_by = models.ForeignKey(User, related_name='created_by_user') 
    # Attributes 
    # Object Manager 
    objects = managers.ProjectManager() 

    # Meta and String 
    class Meta: 
     verbose_name = "Ticket" 
     verbose_name_plural = "Tickets" 
     ordering = ("user", "title") 
     unique_together = ("user", "title") 

    def __str__(self): 
     return "%s - %s" % (self.user, self.title) 

    def get_absolute_url(self): 
     return reverse('ticket_detail', args=[str(self.id)]) 

票務視圖(CreateView的只)

# -*- coding: utf-8 -*- 
... 
from django.views.generic import CreateView, UpdateView, DeleteView 
... 
from .models import Ticket 


... 

class TicketCreate(CreateView): 
    model = Ticket 
    template_name = "tickets/ticket_form.html" 
    fields = ['title', 'description'] 

    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     return super(TicketCreate, self).form_valid(form) 

... 

剖面模型(導入票務模型)

from django.db import models 
from django.conf import settings 
from django.contrib.auth.models import User 
from django.dispatch import receiver 
from django.db.models.signals import post_save 
from . import managers 


class Profile(models.Model): 
    # Relations 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="profile", verbose_name="user") 
    # Attributes 
    interaction = models.PositiveIntegerField(default=0, verbose_name="interaction") 
    # Attributes 
    # Object Manager 
    objects = managers.ProfileManager() 

    # Custom Properties 
    @property 
    def username(self): 
     return self.user.username 

    # Methods 

    # Meta and String 
    class Meta: 
     verbose_name = "Profile" 
     verbose_name_plural = "Profiles" 
     ordering = ("user",) 

    def __str__(self): 
     return self.user.username 


@receiver(post_save, sender=settings.AUTH_USER_MODEL) 
def create_profile_for_new_user(sender, created, instance, **kwargs): 
    if created: 
     profile = Profile(user=instance) 
     profile.save() 
+0

你有什麼問題保存? 'Ticket'或'Profile'或兩者?我會假設'Ticket'。如果是這樣的話,你正在分配'created_by'字段,但是你沒有分配'user'。 – themanatuf

+0

個人資料運行良好...只需將它添加到此票中即可,因爲它與解決方案相關。你能否提供一個分配用戶到票證的例子?謝謝。 –

+1

井'form_valid()'的'你你TicketCreate'已經這樣做:'form.instance.created_by = self.request.user'所以我想你需要做的是:'form.instance.user =自我。 request.user' – themanatuf

回答

4

它看起來像你需要添加以下到form_valid函數中的TicketCreate類:

form.instance.user = Profile.objects.get(user=self.request.user) 

讓我知道,如果這有效!

+0

究竟需要什麼!謝謝。 –

相關問題