2017-01-27 2 views
0

Мне сказали, что рекомендуется использовать поле имени пользователя ForeignKey(User), поэтому я пытаюсь реализовать это сейчас. Но у меня проблемы с переходом от моего текущего Charfield() к полю ForeignKey().Изменение поля моего имени от CharField до ForeignKey

Мой код ниже показывает, как мой текущий CharField() используется для оказания помощи при вызове ajax. В настоящее время он работает, нажимая на имя пользователя, которое получает HTML-адрес этого имени пользователя, а затем может .get() любой профиль, выполнив поиск CharField() следующим образом: profile = Profile.objects.get(username=username_clicked). Кстати, HTML из этого имени пользователя щелкнул от другого Charfield(), author, который является полем в моей модели комментариев, когда кто-то делает комментарий. Таким образом, вызов ajax открывает небольшой поле профиля с несколькими деталями щелчка пользователя. Вот мой код:

профиль модели

class Profile(models.Model): 
    username = models.CharField(max_length=32, default='AnonymousUser') 
    age = models.IntegerField(default=0) 
    points = models.IntegerField(default=0) 

    def __str__(self): 
     return self.username 

JS

$('a.username').on('click', function() { 

    var username = $(this).html(); 
    var url = "/raise_profile/"; 

    $.ajax({ 
     type: 'GET', 
     url: url, 
     data: { 
      username_clicked: username, 
      csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val() 
     }, 
     success: function (data) { 
      $('.profile_username').html(data.username); 
      $('.profile_age').html(data.age); 
      $('.profile_points').html(data.points); 

     } 
    }) 
}); 

вид

def raise_profile(request): 
    username_clicked = request.GET.get('username_clicked') 
    if request.is_ajax(): 
     profile = Profile.objects.get(username=username_clicked) 
     profileAge = profile.age 
     profileUsername = profile.username 
     profilePoints = profile.points 
     return JsonResponse({'age': profileAge, 'username': profileUsername, 'points': profilePoints}) 

комментарий модель

class Comment(models.Model): 
    comment_text = models.TextField(max_length=350, blank=True, null=True) 
    author = models.CharField(max_length=120, blank=True) 

комментарии шаблон

<h3><a class="username">{{ i.author }}</a></h3> 

Может кто-нибудь сказать мне, как я могу изменить свой текущий процесс, так что я могу использовать ForeignKey() вместо CharField() для моего имени/автора поля? Мне сообщили, что в этой ситуации использование ForeignKey() улучшит функциональность.

Кроме того, вот мой комментарий функция, которая включает в себя добавление author поля (имя пользователя, комментирование, как CharField()):

def user_comment(request): 
    if request.is_ajax(): 
     comment = CommentForm(request.POST or None) 
     ajax_comment = request.POST.get('text') #the comment 
     id = request.POST.get('id') 

     if comment.is_valid(): 
      comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id) 
      comment.save() 

      username = str(request.user) 
      return JsonResponse({'text': ajax_comment, 'username': username}) 

ответ

0

Почему играть с CharField(). Лучшим решением было бы иметь автора в модели Comment в качестве внешнего ключа для User. Теперь вы используете тег <a>, используйте свой атрибут href, чтобы удерживать URL-адрес, указывающий на профиль автора. Простой и чистый.

Для например,

class Comment(models.Model): text = field author = models.ForeignKey(User)

Теперь <a> может быть <a href="/url_to_user_profile/id_of_author/">Author Name<a/>. Когда пользователь нажимает на этот якорный тег, извлекает его href и показывает профиль авторов на основе переданного id.

Edit:

Ваш комментарий ниже вы не хотите обновления страницы, так что ваш обработчик щелчка будет как

$("a").on("click", "function(event){ 
    event.preventDefault(); 
    //Make an ajax call here 
}); 
+0

«Профиль» не индивидуальный URL, он просто приносит (AJAX) на одной странице с небольшим резюме пользователя, поэтому я не могу добавить тег ''. – Zorgan

+0

Но эта маленькая коробка подходит через аякс? Тогда почему у вас нет URL-адреса, который принесет вам эти данные? –

+0

Да, но если я это сделаю, добавив тег 'href', то он изменит страницу. Мне нужно оставаться на одной странице (обновление страницы не требуется). – Zorgan

Смежные вопросы