Django - настройки учетной записи BooleanField - PullRequest
1 голос
/ 07 апреля 2020

Я просмотрел большинство постов, связанных с Django и обновлением BooleanField, но не смог найти ничего, связанного с решением моей проблемы. У меня есть пользовательский файл models.py:

# Own custom user model
class Account(AbstractBaseUser):

    username = models.CharField(max_length=30, unique=True)

    guardianSource = models.BooleanField(default=True)
    bbcSource = models.BooleanField(default=False)
    independentSource = models.BooleanField(default=False)

    categoryCoronaVirus = models.BooleanField(default=False)
    categoryPolitics = models.BooleanField(default=False)
    categorySport = models.BooleanField(default=False)

Когда я регистрирую пользователя, кажется, что он регистрирует в базе данных все правильные значения для флажков. Проблема в том, что когда я хочу отредактировать информацию о пользователе, я не вижу, был ли установлен флажок при регистрации или нет, он сам отображает флажки, но все они пусты (False). Тем не менее, он правильно запрашивает имя пользователя и отображает его, чтобы я мог его редактировать, но все флажки сняты. views.py:

def account_view(request):
    if not request.user.is_authenticated:
        return redirect('login')
    context = {}
    if request.POST:
        form = AccountUpdateForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            context['success_message'] = "Updated"
    else: # Display the saved user details from database
        form = AccountUpdateForm(
                                initial = {
                                'username':request.user.username,
                                "guardianSource": request.user.guardianSource,
                                "bbcSource": request.user.bbcSource,
                                "independentSource": request.user.independentSource,

                                "categoryCoronaVirus": request.user.categoryCoronaVirus,
                                "categoryPolitics": request.user.categoryPolitics,
                                "categorySport": request.user.categorySport,
                                            })
    context['account_form'] = form
    return render(request, 'accounts/account.html', context)

account html:

{% extends 'base.html' %}

{% block content %}

<form class="form-signin" method="POST">{% csrf_token %}

  <h1 class="h3 mb-3 font-weight-normal">Account Settings</h1>

  <label for="username" class="sr-only">Username</label>
  <input type="text"   name="username" id="username" class="form-control" placeholder="Username"   value="{{account_form.initial.username}}">
    <br>
   <div  class="form-control">
      <p><b>Please choose news sources!</b></p>

      <label for="guardianSource" >The Guardian</label>
      <input type="checkbox" name="guardianSource" id="guardianSource" value="{{account_form.initial.guardianSource}}" >
    <br>
      <label for="bbcSource" >BBC News</label>
      <input type="checkbox" name="bbcSource" id="bbcSource" value="{{account_form.initial.bbcSource}}" >
    <br>
      <label for="independentSource" >The Independent</label>
      <input type="checkbox" name="independentSource" id="independentSource" value="{{account_form.initial.independentSource}}" >
  </div>
    <br>
    <div  class="form-control">
      <p><b>Please choose news category!</b></p>

      <label for="categoryCoronaVirus" >The Guardian</label>
      <input type="checkbox" name="categoryCoronaVirus" id="categoryCoronaVirus" value="{{account_form.initial.categoryCoronaVirus}}" >

    <br>

      <label for="categoryPolitics" >BBC News</label>
      <input type="checkbox" name="categoryPolitics" id="categoryPolitics" value="{{account_form.initial.categoryPolitics}}" >
    <br>

      <label for="categorySport" >The Independent</label>
      <input type="checkbox" name="categorySport" id="categorySport" value="{{account_form.initial.categorySport}}">

  </div>

    {% for field in registration_form %}
        <p>
            {% for error in field.errors %}
                <p sttle="color:red"> {{ error }}</p>
            {% endfor %}
        </p>
    {% endfor %}
    {% if registration_form.non_field_errors %}
        <div style="color:red;">
                <p>{{registration_form.non_field_errors}}</p>
        </div>
    {% endif %}
    {% for field in account_form %}
        <p>
            {% for error in field.errors %}
                <p sttle="color:red"> {{ error }}</p>
            {% endfor %}
        </p>
    {% endfor %}
    {% if account_form.non_field_errors %}
        <div style="color:red;">
                <p>{{account_form.non_field_errors}}</p>
        </div>
    {% endif %}

    {% if success_message %}
     <p style = "color: green; text-align:center;">{{success_message}}</p>
    {% endif %}
    <h6 class="text-muted">
      If you don't choose a source and category it will automatically assign the ones that are checked!<br>
     NOTE: You <b>MUST</b> select at least 1 choice for each!!!
  </h6>
  <button class="btn btn-lg btn-primary btn-block" type="submit">Save Changes</button>

</form>
<div class="d-flex flex-column">
  <a class="m-auto" href="{% url 'password_change' %}">Change password</a>
</div>


{% endblock content %}

Заранее спасибо, и мне жаль, если мой пост дублируется.

РЕДАКТИРОВАТЬ: Проблема была найдена. В файле account. html значения для каждого флажка типа ввода были неправильными. То, что я изменил с:

<input type="checkbox" name="guardianSource" id="guardianSource" value="{{account_form.initial.guardianSource}}" >

На:

<input type="checkbox" name="guardianSource" id="guardianSource" value="{{account_form.guardianSource}}" >

Для всех входных значений после ввода имени пользователя initial пришлось удалить

1 Ответ

0 голосов
/ 07 апреля 2020

Вам не нужно передавать значение initial при инициализации ModelForm и иметь экземпляр

else: # Display the saved user details from database
    form = AccountUpdateForm(instance=request.user)

Вы можете использовать поле непосредственно в шаблоне, и оно будет отображено с правильными значениями, вы не нужно самостоятельно создавать html для ввода

  <label for="{{ account_form.guardianSource.id_for_label }}">The Guardian</label>
  {{ account_form.guardianSource }}

В документах есть раздел о том, как визуализировать поля вручную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...