Saya ingin berbagi proyek yang saat ini dapat membuat pengguna dan setiap pengguna dapat membuat N posting
Sumber tersedia di github

Dan saya memiliki dua model pengguna dan posting
masukkan deskripsi gambar di sini

Saat ini umpan untuk setiap posting memiliki tombol yang mengirim komentar posting saya ingin mengubahnya untuk menempatkan komentar posting dan tidak mengirim dan email setiap pengguna harus dapat mengomentari posting dan komentar harus tetap ada

{% block container %}
<body id="bg" img style="zoom: 85%; background-position: center center; background-attachment: fixed;background-repeat:no-repeat;padding:5px; background-image: url('{% static "/back.png"%}') ";>
<div style="background-image: url({% static 'static/img/back.png' %});">

    <div class="row" style="align:center">
        {% for post in posts %}
        <div class="col-sm-12 col-md-8 offset-md-4 mt-5 p-0 post-container,width:50%;">
            <div class="card" style="width: 32rem;width:50%;">
                <div class="card-body">
                    <div class="media pt-3 pl-3 pb-1">
                        <a href="{% url " users:detail" post.user.username%}">
                        <img alt="{{ post.user.username }}" class="mr-3 rounded-circle" height="35"
                             src="{{ post.profile.picture.url }}">
                        </a>
                        <h3 class="card-title">{{ post.title }}</h3>
                    </div>

                    <p class="card-text">{{ post.desc }}</p>

                </div>
            </div>
            <img alt="{{ post.title }}" src="{{ post.photo.url }}" style="width: 50%; heigth:60%">

            <div class="media-body">
                <b><p style="margin-top: 5px;">@{{ post.user.username }} - <small>{{ post.created }}</small>
                    &nbsp;&nbsp;
                    <a href="" style="color: #000; font-size: 20px;">
                        <i class="far fa-heart"></i>
                    </a>
                    <br>
                </p></b>


            </div>
            <!-- COMENT SECTION THAT I WANT TO IMPLEMENT MY FEATURE-->
            <form action="{% url 'posts:comment_new' %}" enctype="multipart/form-data" method="POST">
                {% csrf_token %}

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="title"
                        size="16"
                        type="hidden"
                        value="{{post.title}}"
                >

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="first_name "
                        size="16"
                        type="hidden"
                        value="{{user.first_name}}"
                >
                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="last_name "
                        size="16"
                        type="hidden"
                        value="{{user.last_name}}"
                >
                <textarea class="form-control" cols="50" name="comment" rows="5"
                          style="width:50%;" value="{{ comments.comment }}"></textarea>
                <button class="btn btn-outline-info btn-lg" style="width:35%; display:block;margin:auto;" type="submit">
                    Publish
                </button>

            </form>
        </div>
        <br>
        {% endfor %}
    </div>
</div>

{% endblock %}

Seperti yang saya katakan, saya ingin mengganti panggilan fungsi formulir ini untuk membuat bagian komentar alih-alih mengirim email dengan komentar

< form action = "{% url 'posts:comment_new' %}">


def comment_new(request):
    if request.method == 'POST':
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']
        # lastname = request.POST['lastname']

        send_mail("[MAIL] " + subject, user + " " + last_name + " said  " + message + " on http://url.com:8000",
                  'guillermo.varelli@gmail.com',
                  ['guillermo.varelli@gmail.com'], fail_silently=False)
    posts = Post.objects.all().order_by('-created')
    return render(request, os.path.join(BASE_DIR, 'templates', 'posts', 'feed.html'), {'posts': posts})

Saya pikir ini mungkin membuat komentar dengan pengguna dan memposting id dengan detail komentar

def comment_new(request):
    if request.method == 'POST':   
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']

        #lastname = request.POST['lastname']
        form = PostForm(request.POST, request.FILES)
        form.save()

Satu opsi buat komentar

class Comment(models.Model):
    """
    #id= models.AutoField(max_length=1000, blank=True)

    # post = models.ForeignKey(Post, related_name='',on_delete=models.CASCADE,default=0)
    """

    #comment = models.ForeignKey('posts.Post', related_name='posts_rel', to_field="comments", db_column="comments",
     #                           on_delete=models.CASCADE, null=True, default=1, blank=True)
    post = models.IntegerField(blank=True,null=True,unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    username = models.CharField(blank=True, null=True, unique=True ,max_length=200)
    comment = models.CharField(max_length=254, blank=True, null=True)

Lalu bentuk

class CommentForm(forms.ModelForm):

    class Meta:
        """form settings"""
        model = Comment
        fields = ('user','username','post','comment',)

akhirnya dengan fungsi saya bisa bertahan tapi tidak bisa merender

form = CommentForm(request.POST, request.FILES)

# cetak formset.errors

if form.is_valid():
   form.save()

Tetapi saya tidak dapat menemukan cara untuk merender objek pada file html

please feel free to suggest any solution or better create a pull request on the public git hub repo
5
Guillermo Nahuel Varelli 3 Maret 2020, 01:21

1 menjawab

Jawaban Terbaik

Dalam buku Django 2 dengan Contoh kita dapat menemukan panduan langkah demi langkah untuk < strong>buat sistem komentar, di mana pengguna dapat mengomentari kiriman.

Untuk melakukannya, sesederhana empat langkah berikut

  1. Buat model untuk menyimpan komentar
  2. Buat formulir untuk mengirimkan komentar dan memvalidasi data input
  3. Tambahkan tampilan yang memproses formulir dan menyimpan komentar baru ke database
  4. Edit template detail posting untuk menampilkan daftar komentar dan formulir untuk menambahkan komentar baru

  1. Buat model untuk menyimpan komentar

Dalam file models.py Anda untuk aplikasi, tambahkan kode berikut:

class Comment(models.Model): 
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             related_name='comments')
    name = models.CharField(max_length=80) 
    email = models.EmailField() 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
        ordering = ('created',) 

    def __str__(self): 
        return 'Comment by {} on {}'.format(self.name, self.post) 

Model Komentar baru yang baru saja Anda buat belum disinkronkan ke dalam database. Jalankan perintah berikut untuk menghasilkan migrasi baru yang mencerminkan pembuatan model baru:

python manage.py makemigrations APPNAME

Dan

python manage.py migrate

Setelah ini, tabel baru ada di database. Sekarang, buka file admin.py aplikasi blog, impor model Komentar, dan tambahkan kelas ModelAdmin berikut:

from .models import Post, Comment

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'post', 'created', 'active')
    list_filter = ('active', 'created', 'updated')
    search_fields = ('name', 'email', 'body')

  1. Buat formulir untuk mengirimkan komentar dan validasi data masukan

Edit file form.py dari aplikasi blog Anda dan tambahkan baris berikut:

from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

  1. Tambahkan tampilan yang memproses formulir dan menyimpan komentar baru ke database

Edit file views.py, tambahkan impor untuk model Komentar dan formulir CommentForm, dan ubah tampilan detail posting agar terlihat seperti berikut:

from .models import Post, Comment
from .forms import EmailPostForm, CommentForm

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                                   status='published',
                                   publish__year=year,
                                   publish__month=month,
                                   publish__day=day)

    # List of active comments for this post
    comments = post.comments.filter(active=True)

    new_comment = None

    if request.method == 'POST':
        # A comment was posted
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet          
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()                   
    return render(request,
                  'blog/post/detail.html',
                  {'post': post,
                   'comments': comments,
                   'new_comment': new_comment,
                   'comment_form': comment_form})

  1. Edit template detail postingan untuk menampilkan daftar komentar dan formulir untuk menambahkan komentar baru

Pada titik ini kami telah membuat fungsionalitas untuk mengelola komentar untuk sebuah posting. Sekarang, kita perlu menyesuaikan template post/detail.html kita untuk melakukan hal-hal berikut: - Menampilkan daftar komentar - Menampilkan formulir bagi pengguna untuk menambahkan komentar baru

Tambahkan baris berikut ke template post/detail.html untuk daftar komentar:

{% for comment in comments %}
  <div class="comment">
    <p class="info">
      Comment {{ forloop.counter }} by {{ comment.name }}
      {{ comment.created }}
    </p>
    {{ comment.body|linebreaks }}
  </div>
{% empty %}
  <p>There are no comments yet.</p>
{% endfor %}

Kemudian, untuk poin lainnya, tambahkan baris berikut:

{% if new_comment %}
  <h2>Your comment has been added.</h2>
{% else %}
  <h2>Add a new comment</h2>
  <form action="." method="post">
    {{ comment_form.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Add comment"></p>
  </form>
{% endif %}
8
Tiago Martins Peres 李大仁 5 Maret 2020, 10:51