Ошибка: выберите правильный выбор. Этот вариант не является одним из доступных. - PullRequest
0 голосов
/ 10 июля 2020

Я создаю блог, используя Django. Я хочу, чтобы мой автор был автоматически выбран в поле автора. На самом деле поле правильно заполняется javascript, но когда я отправляю форму, она показывает: «Выберите действительный выбор. Этот выбор не является одним из доступных вариантов». Но я предоставил ему поле TextInput. Хорошо работает, когда автору вместо TextInput предоставляется Select. Но я не хочу позволять автору выбирать. Я хочу, чтобы он заполнялся именем first_name, который вошел в систему.

Я хочу автоматически обновлять свой список выбора, когда новая категория добавляется в форму без закрытия весь сервер выключен, а затем запустите его снова.

Forms.py

from django import forms
from .models import Post, Category
from django.contrib.auth.models import User

# choices = [('coding','coding'),('entertainment','entertainment'),('sports','ssports')]
choices = Category.objects.all().values_list('name','name')
choice_list = []

for item in choices:
    choice_list.append(item)

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'title_tag','author','category', 'body', 'snippet')

        widgets = {
            'title': forms.TextInput(attrs={'class':'form-control'}),
            'title_tag': forms.TextInput(attrs={'class':'form-control'}),
            'author': forms.TextInput(attrs={'class':'form-control', 
                        'id':'gauname','value':'','type':'hidden'}),
            # 'author': forms.Select(attrs={'class':'form-control'}),
            'category': forms.Select(choices=choice_list,attrs={'class':'form-control'}),
            'body': forms.Textarea(attrs={'class':'form-control'}),
            'snippet': forms.Textarea(attrs={'class':'form-control'}),
        }

views.py

class AddCategoryView(CreateView):
    model = Category
    form_class =  AddCategory
    template_name = 'add_category.html'
    # fields = '__all__'

models.py


class Post(models.Model):
    title = models.CharField(max_length=255)
    title_tag = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    # body = models.TextField()
    body = RichTextField(blank=True, null=True)
    post_date = models.DateTimeField(default=datetime.now)
    category = models.CharField(max_length=255, default='coding')
    snippet = models.CharField(max_length=255)
    likes = models.ManyToManyField(User, related_name='blog_posts')

    def total_likes(self):
        return self.likes.count()

    def __str__(self):
        return self.title + '|' + str(self.author)

    def get_absolute_url(self):
        # return reverse('article-detail', args=(str(self.id)))
        return reverse('home')

HTML


{% block content %}
{% if user.is_authenticated %}
  <h1>Add Post...</h1>
  <br><br><br>

  <form method="POST">
    <div class="form-group">
      {% csrf_token %}
      {{form.media}}
      {{form.as_p}}
      <!-- <input class = form-control type="text" id="gauname" name="author" value=""> -->
      <button class="btn btn-secondary" name="button">Post</button>
   </div>


  </form>

  <script>
    var name = "{{ request.user.first_name }}";
    document.getElementById("gauname").value = name;

  </script>
{% else %}

You are not allowed here!
{% endif %}


{% end block %}

ОБНОВЛЕНИЕ

forms.py

class AddCategory(forms.ModelForm):
        class Meta:
            model = Category
            fields = ('name',)

            widgets = {
                'name': forms.TextInput(attrs={'class':'form-control'}),
            }

            def __init__(self, *args, **kwargs):
                super().__init__(*args, **kwargs)
                self.fields["name"] = forms.ModelChoiceField(
                    queryset=Category.objects.all(),
                )

Я хочу автоматически обновлять свой список выбора при появлении нового Категория добавляется в форму без выключения всего сервера, а затем запускается снова.

1 Ответ

0 голосов
/ 10 июля 2020

Если есть два человека с одинаковым именем, как Django должен знать, кто здесь пользователь? Другими словами, как Django может сопоставить имя пользователя? Это не имеет смысла

Так как это все равно скрытое поле, вместо request.user.first_name вы можете просто передать request.user.pk (уникальный идентификатор этого конкретного пользователя)

...