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

究竟需要什么!谢谢。 –

相关问题