Ввод имени пользователя зарегистрированного пользователя в качестве метки в поле формы django - PullRequest
0 голосов
/ 10 ноября 2018

Я создал простое приложение для блога django, где пользователь может войти и выйти. В этом приложении пользователь может создавать новые сообщения только тогда, когда он вошел в систему. Для этого я создал форму для создания сообщения для аутентифицированного пользователя, где он должен указать название, имя автора и контекст. Но я хочу поместить имя пользователя, вошедшего в систему, в качестве метки в поле Author_name, которое пользователь не может редактировать. поэтому я отключил это поле для редактирования, но не смог поместить имя пользователя, вошедшего в систему, внутри этого поля в качестве метки. Нужна помощь, ребята.

Мой код идет сюда ....

views.py

from django.shortcuts import render , redirect , get_object_or_404
from .models import Article , members
from django.views.generic import ListView , DetailView , TemplateView
from .forms import create_form
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User

class article_view(ListView):
    model = Article
    template_name = "article.html"
    context_object_name = "articles"


@login_required
def post_creator(request):
    form = create_form()
    if request.method == "POST":
        form = create_form(request.POST)
        if form.is_valid():
            form.save()
            return redirect("/blog/home/")

    else:
        form = create_form()
    return render(request , "post_create.html" , {"form":form})

def registration(request):
    if request.method == "POST":
        form = members(request.POST)
        if form.is_valid():
            form.save()

            return redirect("/blog/home/")

    else:
        form = members()
    return render(request , "register.html" , {"form":form})    



class post_detail_view(LoginRequiredMixin , DetailView):
    model = Article
    template_name = "detail.html"

#class profile(TemplateView):
#   model = members
#   template_name = "profile.html"

def counts(request):
    counts = Article.objects.filter(author=request.user).count()
    context = {

        "counts":counts
    }
    return render(request , "profile.html" , context)

forms.py

from django import forms
from datetime import date
from .models import Article
import datetime
from django.contrib.auth.models import User

class create_form(forms.ModelForm):
    author = forms.CharField(required=False , widget=forms.TextInput(attrs={'readonly':'True'}))

    class Meta:
        model = Article
        fields = ["title" , "author" , "content"]

models.py

from django.db import models
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User



class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    date_pub = models.DateTimeField(auto_now=True)
    content = models.TextField()

    def __str__(self):
        return self.title


class members(UserCreationForm):
    email = models.EmailField()

    class Meta:
        model = User
        fields = ["username" , "email"]

create_post.html

{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">



    <title>Create Post</title>
</head>


</head>
<body style="background-color: darkgrey;">
    <div>
        <fieldset style="width: 50%;background-color: white;padding: 25px ;margin-left: 350px;margin-top: 15px;border-color: black;">
            <form method="POST">
            <legend>Create New Post</legend>
                {% csrf_token %}
                {{ form|crispy }}
                <button class="btn btn-outline-info" type="submit">Create</button>
            </form>
        </fieldset>
    </div>

</body>
</html>

Надеюсь, это поможет понять мою проблему.

1 Ответ

0 голосов
/ 10 ноября 2018

Самое простое решение, которое напрямую относится к вашему коду, вы можете сделать

form = create_form(initial={'author':request.user.username}) #or request.user may work because it returns the username as a string

В качестве более общего решения, которое также обновляет имя пользователя в случае его изменения по любой причине, можно использовать ForeignKey

В тебе models.py

    class Article(models.Model):
        title = models.CharField(max_length=100)
        author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
        date_pub = models.DateTimeField(auto_now=True)
        content = models.TextField()

        def __str__(self):
            return self.title

В вашем forms.py не перечисляйте его в fields перечислите его как одно из полей (оставьте его как есть).

Затем в вашем views.py назначьте его следующим образом:

if form.is_valid():
    instance=form.save(commit=False)
    instance.author=request.user
    instance.save()

Вы измените author в вашем примере на author_name для согласованности. Идея заключается в том, что вы можете фильтровать по пользователю (или по любому другому свойству пользователя, например по возрасту или полу или тому, что на самом деле содержит ваша модель)

...