2016-07-19 11 views
1

Я создал модель «пост», в которую я включил «post_id» в качестве поля первичного ключа. Когда я пытаюсь создать сообщение, это вызывает ошибку: «плохо сформированная шестнадцатеричная строка UUID». Я был бы признателен за помощь в решении этой проблемы.Python: как решить проблему: «плохо сформированная шестнадцатеричная строка UUID» в Django

Вот мой код.

Models.py:

class Post(models.Model): 

    post_id = models.UUIDField(primary_key=True, default='uuid.uuid4', editable=False) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    from1 = models.CharField(max_length=20) 
    To = models.CharField(max_length=20) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

    objects = PostManager() 

    def __unicode__(self): 
     return self.post_id 

    def __str__(self): 
     return self.post_id 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"post_id": self.post_id}) 

    class Meta: 
     ordering = ["-timestamp", "-Time"] 

views.py:

def post_create(request): 

    form = PostForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     print(form.cleaned_data.get("post_id")) 
     instance.user = request.user 
     instance.save() 
     return HttpResponseRedirect(instance.get_absolute_url()) 
    context = { 
     "form": form, 
    } 
    return render(request, "loggedin_load/post_load.html", context) 
+0

Почему вы хотите создать пользовательский 'post_id'? По умолчанию модели Django содержат поле 'id' и' pk'. Вы можете использовать любой из них для отслеживания 'post_id'. – jape

+0

Какая полная ошибка вы получаете? – Pureferret

+3

Попробуйте без кавычек, 'default = uuid.uuid4' – Rohan

ответ

2

Вам необходимо импортировать модуль, а не использовать котировки вокруг 'uuid.uuid4'.

Это должно быть несколько, как:

import uuid # The uuid module 
class Post(models.Model): 

    post_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # using the function uuid4 on the module 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    from1 = models.CharField(max_length=20) 
    To = models.CharField(max_length=20) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

    objects = PostManager() 

    def __unicode__(self): 
     return self.post_id 

    def __str__(self): 
     return self.post_id 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"post_id": self.post_id}) 

    class Meta: 
     ordering = ["-timestamp", "-Time"] 

N.B Я не проверял выше код, и я согласен с некоторыми из комментариев, которые не нуждаются в UUID для POST_ID. Не зная больше, я не мог больше помочь.

2

Я хотел бы сделать что-то вроде этого:

from django.utils.encoding import python_2_unicode_compatible 

@python_2_unicode_compatible 
class Post(models.Model): 
    # Instead of default, maybe do null=True to take old entries into account? 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    from1 = models.CharField(max_length=20) 
    # You may want to reconsider the naming of the "To" field 
    # to avoid capital letters and built-in functions 
    To = models.CharField(max_length=20) 
    timestamp = models.DateTimeField(auto_now_add=True) 

    objects = PostManager() 

    # You can remove this with the decorator above 
    # def __unicode__(self): 
     # return self.id 

    def __str__(self): 
     return self.id # acts as your post_id 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"post_id": self.id}) 

    class Meta: 
     ordering = ["-timestamp", "-Time"] 

Всякий раз, когда создается объект, он автоматически будет назначил идентификатор, который заполнит ваши __unicode__, __str__ и get_absolute_url.