Flask QuerySelectField Edit Form - PullRequest
0 голосов
/ 28 мая 2018

В моей форме есть следующее поле Выбор запроса, в котором будут выбираться значения из базы данных во время процесса вставки.После завершения вставки вставленная запись будет отображаться в таблице с опцией " EDIT ".После нажатия Edit я хочу, чтобы формы были предварительно заполнены выбранной записью.

В моем случае у меня есть два поля Query Select , которые должны быть предварительно заполнены .Я изо всех сил стараюсь сделать это, я не добиваюсь большого успеха в этом.Подскажите, пожалуйста, что я делаю не так?

Код для формы

def choice_pername():
    return Persons.query.filter_by(u_id=current_user.id)
    #return Persons.query.with_entities(Persons.per_name).filter_by(u_id=current_user.id)

def choice_eartype():
    return EarType.query.filter_by(u_id=current_user.id)

class EarningEntryForm(FlaskForm):
    Ear_per_name = QuerySelectField(query_factory=choice_pername,allow_blank=False,get_label='per_name',)
    Ear_type_name = QuerySelectField(query_factory=choice_eartype,allow_blank=False,get_label='EarType_name')
    Ear_amt = FloatField('Earning Amount:-',validators=[DataRequired()])
    Ear_date = DateField('Earning Date:-',format = '%Y-%m-%d',validators=[DataRequired()])
    Ear_FileName = StringField('Earning FileName:-')
    Ear_img = FileField('Earning Proof File:-')
    Ear_comm = TextAreaField('Earning Comment:-',validators=[DataRequired()])
    submit = SubmitField('Save Earning')
    Delete = SubmitField('Delete')

Кодовые маршруты

@bp.route('/earnings/edit_earn',methods=['GET','POST'])
@login_required
def edit_earn():
    earID = request.args.get("earn_id")
    earnings = Earnings.query.filter_by(id= earID,U_id=current_user.id).all()
    form = EarningEntryForm()
    meth = request.method
    if form.validate_on_submit():
        earnings.Ear_per_name =str(form.Ear_per_name.data)
        earnings.Ear_type_name =str(form.Ear_type_name.data)
        earnings.Ear_amt = form.Ear_amt.data
        earnings.Ear_date = form.Ear_date.data
        earnings.Ear_FileName = form.Ear_img.data.filename
        earnings.Ear_img = form.Ear_img.data.read()
        earnings.Ear_comm =form.Ear_comm.data
    elif request.method == 'GET':
        Earid = EarType.query.filter_by(EarType_name =earnings[0].Ear_type_name).all()
        Perid = Persons.query.filter_by(per_name =earnings[0].Ear_per_name).all()
        #form = EarningEntryForm(Ear_per_name=Perid[0].id, Ear_type_name=Earid[0].id)
        form.Ear_type_name.data = Earid
        form.Ear_per_name.data= Perid
        form.Ear_amt.data = earnings[0].Ear_amt
        form.Ear_date.data = earnings[0].Ear_date
        form.Ear_FileName.data = earnings[0].Ear_FileName
        form.Ear_comm.data = earnings[0].Ear_comm
    return render_template('earning/earn_Edit.html', form=form, ear=earnings)

Шаблон кода Jinja

<div class="col-md-4">
 <h1>E2ISA Earning Edit</h1>

<form class="form-inline" method="post">
{{ form.hidden_tag() }}
{{ form.csrf_token }}

    <input type="text" name="ear_id" value="{{ear.id}}" hidden>

<p>
Selected Person Name:<br>
{{ form.Ear_per_name(class='btn btn-secondary dropdown-toggle')}}
{% for error in form.Ear_type_name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>

<p>
Selected Earning Type:<br>
{{ form.Ear_type_name(class='btn btn-secondary dropdown-toggle')}}
    {% for error in form.Ear_type_name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>

<p>
{{ form.Ear_amt.label }}<br>
{{ form.Ear_amt(size=32,class='form-control') }}
    {% for error in form.Ear_amt.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>

<p>
{{ form.Ear_date.label }}<br>
{{ form.Ear_date(class='datepicker') }}
    {% for error in form.Ear_date.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>

<p>
{{ form.Ear_FileName.label }}<br>
{{ form.Ear_FileName (class='form-control')}}
    {% for error in form.Ear_FileName.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.Ear_comm.label }}<br>
{{ form.Ear_comm (class='form-control') }}
    {% for error in form.Ear_comm.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>

<p>{{ form.submit(class='btn btn-primary') }}</p>
</form>
<form class="form-inline" action="/earnings/DeleteEarn">
{{ form.csrf_token }}
<input type="text" name="ear_id" value="{{ear.id}}" hidden>

{{ form.Delete(class='btn btn-primary') }}
</form>

</div>
{% endblock %}

Вот модель БД enter image description here

1 Ответ

0 голосов
/ 29 мая 2018

Я решил, используя следующий код

form.Ear_type_name.data =int(Earid[0].id)
form.Ear_per_name.data = int(Perid[0].id)

Код выше - это значение индекса прохода соответствующего выбранного поля, чтобы сформировать тип поля выбора, в моем случае это было 1|Nirav, поэтому мне нужно пройти 1, чтобы выбратьтип данных формы поля.

В форме я использовал поле выбора вместо поля выбора запроса.

Ear_per_name=SelectField('PersonName', choices=[], coerce=int)
Ear_type_name=SelectField('EarningType Name', choices=[], coerce=int)

Вы можете загрузить это поле из базы данных, используяследующий метод

person=Persons.query.filter_by(u_id=current_user.id)
eartype = EarType.query.filter_by(u_id=current_user.id)
eartype_list = [(j.id, j.EarType_name) for j in eartype]
person_list = [(i.id, i.per_name) for i in person]
form.Ear_per_name.choices = person_list
form.Ear_type_name.choices = eartype_list

Вот мой обновленный метод редактирования кода маршрута

@bp.route('/earnings/edit_earn',methods=['GET','POST'])
@login_required
def edit_earn():
    earID = request.args.get("earn_id")
    earnings = Earnings.query.filter_by(id= earID,U_id=current_user.id).all()
    form = EarningEntryForm(request.form,obj=earnings)
    meth = request.method
    if form.validate_on_submit():
        earnings.Ear_per_name =str(form.Ear_per_name.data)
        earnings.Ear_type_name =str(form.Ear_type_name.data)
        earnings.Ear_amt = form.Ear_amt.data
        earnings.Ear_date = form.Ear_date.data
        earnings.Ear_FileName = form.Ear_img.data.filename
        earnings.Ear_img = form.Ear_img.data.read()
        earnings.Ear_comm =form.Ear_comm.data

    elif request.method == 'GET':
        #THis code will load the dropdown box.
        person = Persons.query.filter_by(u_id=current_user.id)
        eartype = EarType.query.filter_by(u_id=current_user.id)
        eartype_list = [(j.id, j.EarType_name) for j in eartype]
        person_list = [(i.id, i.per_name) for i in person]
        form.Ear_per_name.choices = person_list
        form.Ear_type_name.choices = eartype_list

        #This where edit form take place.
        Earid = EarType.query.filter_by(EarType_name =earnings[0].Ear_type_name).all()
        Perid = Persons.query.filter_by(per_name =earnings[0].Ear_per_name).all()
        form.Ear_type_name.data =int(Earid[0].id)
        form.Ear_per_name.data = int(Perid[0].id)
        form.Ear_amt.data = earnings[0].Ear_amt
        form.Ear_date.data = earnings[0].Ear_date
        form.Ear_FileName.data = earnings[0].Ear_FileName
        form.Ear_comm.data = earnings[0].Ear_comm
    return render_template('earning/earn_Edit.html', form=form, ear=earnings)

Happy Codding.

...